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()で単体テストを実行します。