0

私はまだユニットテストのコツをつかもうとしています。簡単な質問があります。今日は、非常に単純な関数のテストを作成したいと思いました。この関数はまさにこれを行っていました:

void OnSomething()
{
   increment++;

   if (increment == 20)
     SaveIt();
}

私が言ったように、この関数はテスト可能である可能性があります。それを20回呼び出すテストを作成してから、SaveItが呼び出されたことを確認できます。

それから私の疑問が生じました。SaveItが呼び出されたことをテストするにはどうすればよいですか?私の最初の答えはブール値を追加することでしたが、それから私は考えました:それをテスト可能にするためだけにクラス機能を追加するのは正しいですか?

お知らせ下さい。ありがとうございました。

4

2 に答える 2

3

SaveItに成功または失敗の結果を返すようにすることをお勧めします。これにより、全体的なテストが簡単になります。ブール値を返すような単純なことを行うことも、成功したか失敗したかを報告する必要がある場合は、メッセージを設定する機能を含む汎用結果クラスを作成することもできます。

簡単な例

public class Result
{
   public bool IsSuccess;
   public List<string> Messages;
}

単体テストでは、OnSomethingの動作のみをテストしようとしていますが、「SaveIt」内で発生することはテストしないでください。したがって、理想的には、SaveIt()を別のクラスで発生させて、その応答をモックできるようにする必要があります。

私はこの目的のためにMoqを使用します。Moqは無料です。ここで入手できます:http ://code.google.com/p/moq/

私の方法は

Result OnSomething()
{
    Result result=null;
    increment++;
    if(increment == 20)
    {
         result = saver.SaveIt();
    }
    return result;
}

クラスコンストラクターは、ISaverインターフェイスを実装するオブジェクトを取得します(SaveIt()メソッドを定義します)(理想的にはDIフレームワークによって注入されますが、必要に応じて手動で生成できます)。

ここで、単体テストでISaverのモックバージョンを作成し、呼び出されたときに何を返すかを指示します。

 Mock<ISaver> mock = new Mock<ISaver>();
 mock.Setup(x=> x.SaveIt()).Returns(new Result{IsSuccess=true});

コンストラクターのISaverパラメーターでmock.Objectを渡してクラスをインスタンス化します。

元。

 MyClass myClass = new MyClass(mock.Object);  
 //(assuming it didn't have other parameters)

次に、結果がnullであるかどうかをアサートできます。呼び出されなかった場合、上記で行ったセットアップはトリガーされないため、nullになります。

 (in nunit)
 Result result = myClass.OnSomething();
 Assert.IsNotNull(result);

OnSomething()が結果を返すことを本当に望まない場合、またはイベントであるために返すことができない場合は、OnSomething()にメソッドを呼び出して作業を実行させます。

 void OnSomething()
 {
      Result result = DoTheWork();
 }

 Result DoTheWork()
 {
    Result result=null;
    increment++;
    if(increment == 20)
    {
         result = saver.SaveIt();
    }
    return result;
 }

次に、OnSomething()ではなくDoTheWork()で単体テストを実行します。

于 2012-06-19T20:53:22.180 に答える
2

絶対にありません!本番コードはテストにまったく依存しないはずですが、テストは実際のコードの正しい動作を検証する必要があります。これは、 IOCモックの使用などのいくつかの方法で実現できます。あなたはあなたの人生を大いに単純化するいくつかの既存のフレームワークを見ることができます:

于 2012-06-19T21:24:20.177 に答える