2016-12-07 11 views
0

私は基本的にパイプラインのクラスを持っています。メッセージを処理し、バッチで削除します。これを行うには、ProcessMessage()メソッドはメッセージを直接削除しません。私書箱Observable<IMessage>()に追加します。私はそれから、観測可能なものを監視し、メッセージを大量に削除する別の公開方法を持っています。以下のようなコードになりプライベートプロパティを使用するパブリックメソッドの単体テストをテストするにはどうすればよいですか?

public void CreateDeletionObservable(int interval = 30, int messageCount = 10) 
{ 
    this.processedMessages.Buffer(TimeSpan.FromSeconds(interval), messageCount).Subscribe(observer => 
    { 
     client.Value.DeleteMessages(observer.ToList()); 
    }); 
} 

問題は、私のユニットテストがprocessedMessagesの値がないということです。プライベートなので、私はmoq'dの値を提供することはできません。私は、どの値がprocessedMessagesにあるかをテストする必要はありません。私は、そのメソッドの動作をテストするために、それらが存在する必要があります。具体的には、例外がスローされた場合(そのロジックはまだコードにない)、私のobservableが実行を継続することをテストする必要があります。私はそれを見るので、私はいくつかのオプションがあります:

1)1人のエントリーポイントといくつかの終了(成功、エラー、再試行など)を持つ単一のモンスター観察可能なチェーンを使用するように私のクラスをリファクタリングします。こので、パブリックメソッド間でコレクションを渡すためにプライベートプロパティを使用しないようにします。しかし、その連鎖は、はるかに少ないユニットテストを解析することは非常に困難です。私は自分のコードを読みにくくてテスト可能にすることは実行可能な選択だとは思わない。

2)は、メッセージのテストリストを受け入れるように、私のCreateDeletionObservable方法に変更します

public void CreateDeletionObservable(int interval = 30, int messageCount = 10, IObservable<IMessage> processedMessages = null) 

私が使用するメソッドのスタブデータを供給できるようになるが、それは恐ろしいコードのにおいです。これのバリエーションは、Observableをコンストラクタレベルに挿入することですが、それは良くありません。おそらく悪い。

3)processedMessagesを公開します。

4)この機能はテストしないでください。

私はこれらのオプションが嫌いですが、私は2に向かって傾いています。テスト目的のためのリストを注入する。私はここで行方不明のオプションはありますか?

+0

私はMoqが私有財産を模倣できると考えました。私は間違っているのですか? –

+0

@CodeswithHammerそれは理想的でしょう。おそらく私はそこにいくつかの機能が欠けているでしょうか?私はAPIドキュメントを掘り下げます。 – Necoras

+0

'processedMessages'をコンストラクタ注入する際の下手なことは何ですか? – Shlomo

答えて

1

あなたの感覚がうまくいきます。私はこの場合、あなたが "あなたの境界をテストする"(Udi Dahan、しかし参照を見つけることができない)という役に立つと思うガイダンスに戻すことができると思います。

メッセージを入力することができます(Observable Sequenceを介して)、副作用としてこれらのメッセージを最終的にクライアントから削除すると思われます。だから、あなたのテストが「10件のメッセージが処理されると、その後のイベントは、クライアントから削除されているEventProcessorを考えると、」

  • のようなものを読まなければならないようだ
  • 「を考えるEventProcessor、5件のメッセージがで処理された場合30代は、その後のイベントは、チェーンをテストする、(ここで、そのインスタンスから来たのか?)クライアント」

から削除ので、代わりの何とかに関するthis.processedMessagesを知っているパイプのこの小さな部分をテストしています。しかし、これは大量の使用不可能なチェーンを作成する必要があるわけではありません。チェーンをテスト可能にするのに十分なだけ作成してください。

さらに多くのコードベースを提供することも役立ちます。どこがthis.processedMessages & client.Valueから来ていますか?これはおそらく重要であり、より機能的なアプローチを適用すると推測して助けになるでしょうか?

関連する問題