14
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[C#][.NET] モックライブラリNSubstitute使い方メモ

Last updated at Posted at 2017-02-20

.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に引数がたまります。

:warning: 引数のインスタンスが変化するようなときは、クローンを作らないとテストが期待通りにならないかもしれません。

14
15
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?