3

これをテストする方法は?

public void TestMethod()
{
   if(aDenpendency.someMethod()) return;

   // Followed by other logic....
}

次のロジックには別の依存関係がないため、AssertWasNotCalled を使用できませんでした。

前もって感謝します!!

4

2 に答える 2

4

あなたが説明しているようにテストするのは間違いです。そして、コード構造が貧弱であり、明確なコードの匂いであることを示します。そのコードをリファクタリングして単体テストする必要があります。呼び出されていないことをテストすることを目的としていることを考えると、呼び出されたときのテストも必要になります。

メソッドに単一の責任を持たせる必要があるため、より賢明な単体テストを行うには、戻り値の後にロジックを取り出してメソッドに入れ、そのメソッドの出力を単体テストすることができます。

単体テストは、呼び出されなかったものをテストするためのものではありません。モック/偽物によって期待されるセットアップをテストするため、または操作の結果をテストする必要があります。

メソッドが呼び出された後のオブジェクトの状態をテストするテストを作成することもできますが、これは実際には単体テストではなく統合テストです。つまり、return ステートメントが実行された後にあるべき状態をテストできることを意味します。他のコードは実行されていないため、変更またはプロセスが変更されていません。

于 2012-04-12T20:52:53.993 に答える
0

テストしているメソッドに、たとえば Running\Processing\Aborted などの「ステータス」プロパティを設定することはどうですか?

したがって、設定しているテスト状況で void メソッドを呼び出し、後でプロパティを確認します。リターン; および Status プロパティの設定は、コード内で一緒になります

if(condition){
    _status = 1; //Or use an enumeration would be better
    return;
}

テストは、パブリック アクセサーを介してステータスをテストします。

これはすべての場合に適切であるとは限りませんが、クラスに void メソッド Process() がある場合に、このようなことを行うことを検討しています。モックを必要としないため(ただし、スタブはまだ必要な場合があります)、おそらくテストが簡単になり、何かが起こらなかったのではなく、何かが起こったかどうかを積極的にテストできることを意味します(これは以前のポスターに同意します可能であればより良いアプローチ)

これは、テストを許可するためだけにコードを書くのにおいがするかもしれないことに気付きましたが、私の特定のケースでは、コードの実際の実行中にクラスの状態をチェックするために public プロパティを使用するので、このアプローチ全体が全体的な設計と一致しています。

于 2012-06-19T05:43:46.153 に答える