.Net向けのモックライブラリは数あります。そのうちNSubstituteは、staticクラスや拡張メソッドをモック化できて便利なのです。
2024-10-02 追記
staticクラスや拡張メソッドをモック化できて
上記の部分について、@laughter さんのコメントを参照してください。
https://qiita.com/sengoku/items/48f58f778a05f13f922e#comment-8cfd13436bf81b4b14a4
インストールの仕方
Visual Studioであれば、プロジェクトを右クリック > Manage NuGet Packages... メニューを選択、あとは「NSubstitute」を検索してインストールするだけです。
モックの生成
まずはモックの生成から。
var mock = NSubstitute
.Substitute
.For<モック対象クラス>();
メソッド戻り値の定義
引数がない場合
mock.SomeMethod()
.Returns(戻り値);
引数を指定する場合
mock.SomeMethod(NSubstitute.Arg.Is(引数))
.Returns(戻り値);
引数はなんでもいい場合
mock.SomeMethod(NSubstitute.Arg.Any<型>())
.Returns(戻り値);
プロパティ戻り値の定義
mock.SomeProperty
.Returns(戻り値);
メソッド呼び出しのベリファイ
メソッドが呼び出されたかどうかテストします。
mock.Received()
.SomeMethod();
呼び出し回数もベリファイ
3回呼び出されたかどうかテストします。
mock.received(3)
.SomeMethod();
余計な呼び出しが行われていないか
mock.DidNotReceived()
.SomeMethod();
メソッド呼び出し時の引数を捕まえる (capture arguments)
このようなテスト対象のクラスがあったとしまして、
class Foo
{
Result Bar(Baz baz)
{
// some stuff
}
}
こうします。
var capturedArgs = new List<Baz>();
mock.Bar(Arg.Do<Baz>(x => capturedArgs.Add(x)));
capturedArgs
に引数がたまります。
引数のインスタンスが変化するようなときは、クローンを作らないとテストが期待通りにならないかもしれません。