NSubstitute
NSubstitute は主にユニットテストで利用できる .Net 用の Mock ライブラリです。
今回の記事では v4.2.1 で動作を確認しています。
使い方
Sample
今回はこのようなインターフェースを例に使い方を説明します。
public interface INSubstituteSample
{
void Hoge(int a, int b);
bool Fuga(int a, int b);
}
モックの作成
Substitute.For<インターフェース名>()
でモック化したインスタンスを取得します。
var mock = Substitute.For<INSubstituteSample>();
処理の置き換え
戻り値がある場合
引数を指定する
Returns()
を使います。
mock.Fuga(1, 2).Returns(true);
Assert.IsTrue(mock.Fuga(1, 2)); // 成功
Assert.IsTrue(mock.Fuga(2, 2)); // 失敗
どんな引数の場合でも決まった値を返す(1)
先ほどは引数が指定したものと一致していた場合に特定の値を返していました。
引数がどんな値でも決まった値を返したい場合は ReturnsForAnyArgs()
を使うことができます。
mock.Fuga(1, 2).ReturnsForAnyArgs(true);
Assert.IsTrue(mock.Fuga(1, 2)); // 成功
Assert.IsTrue(mock.Fuga(2, 2)); // 成功
どんな引数の場合でも決まった値を返す(2)
戻り値のあるメソッドに対して引数がどんな値でも決まった値を返させたい場合に、Arg クラスを使うことでReturns()
で指定することもできます。
mock.Fuga(Arg.Any<int>(), Arg.Any<int>()).Returns(true);
Assert.IsTrue(mock.Fuga(1, 2)); // 成功
Assert.IsTrue(mock.Fuga(2, 2)); // 成功
呼び出し時に別の処理をする
Returns()
, ReturnsForAnyArgs()
では引数にラムダ式を指定することで呼び出し時に指定した処理をさせることができます。
mock.Fuga(1, 2).Returns(x => Console.WriteLine("Called"));
呼び出し時の処理で元のメソッドの引数を取得する
Returns()
のラムダ式の中では、元のメソッドを呼び出す際に使われた引数を取得することもできます。
mock.Fuga(Arg.Any<int>(), Arg.Any<int>()).Returns(x =>
{
return x.ArgAt<int>(0) > x.ArgAt<int>(1);
});
Assert.IsTrue(mock.Fuga(1, 0)); // 成功
Assert.IsTrue(mock.Fuga(1, 2)); // 失敗
戻り値がない場合
Returns()
が使えるのは値を返すメソッドに対してのみです。
値を返さないメソッドに対しては When()
と Do()
を使って処理を置き換えることができます。
mock.When(x => x.Hoge(1, 2)).Do(x => Console.WriteLine("Called") );