web-dev-qa-db-ja.com

Moq-It.IsAny <string>()は常にnullを返します

It.IsAny<string>()がすべての呼び出しでnullを返す原因は何ですか? null以外の文字列を返すように設計されていると仮定するのは間違っていますか?

使用法は次のとおりです。Loginメソッドがnullの2番目の引数(接続文字列)に対してArgumentNullExceptionをスローします。 It.IsAny<string>()がnull以外の文字列を提供し、ArgumentNullExceptionをバイパスすると想定していました。

var mockApiHelper = new Mock<ApiHelper>();
mockApiHelper.Setup(m => m.Connect(It.IsAny<string>(), 
                                   It.IsAny<string>(), 
                                   It.IsAny<string>()));

var repositoryPlugin = new RepositoryPlugin(mockApiHelper.Object);
repositoryPlugin.Login(new CredentialsInfo(), It.IsAny<string>());

Assert.IsTrue(repositoryPlugin.LoggedIn, 
    "LoggedIn property should be true after the user logs in.");
19
Jeremy

ええと、 _It.IsAny<TValue>__Match<TValue>.Create_ -を呼び出した結果を返すだけで、default(TValue)を返します。これは、どの参照型でもnullになります。

ただし、実際に正しいオブジェクトで呼び出しているかどうかは明確ではありません。実際のコードではなく、モックで呼び出しているべきではありません。 ?

私が見たすべてのサンプルは、_It.IsAny_呼び出しのコンテキストで_mock.Setup_を使用しています。あなたがそれをどのように使おうとしているのかについてもっと情報を教えてください。

25
Jon Skeet

いいえ、It.IsAnyは、渡されたすべての文字列が一致することをセットアップで指定するために使用されます。メソッドが特定の文字列でのみ呼び出された場合に返されるようにセットアップを行うことができます。このことを考慮:

myMock.Setup(x => x.DoSomething(It.IsAny<string>()).Return(123);
myMock.Setup(x => x.DoSomething("SpecialString").Return(456);

モックを使用しているものはすべて、DoSomethingが呼び出されたときにモックに渡されるパラメーターに応じて異なる値を取得します。メソッド呼び出しを検証するときにも同じことができます。

myMock.Verify(x => x.DoSomething(It.IsAny<string>())); // As long as DoSomething was called, this will be fine.
myMock.Verify(x => x.DoSomething("SpecialString"));  // DoSomething MUST have been called with "SpecialString"

また、質問を編集したようです。の代わりに:

Assert.IsTrue(repositoryPlugin.LoggedIn, "LoggedIn property should be true after the user logs in.");

これを行う:

mockApiHelper.Verify( x => x.Connect(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()), Times.Once()); // Change times to whatever you expect.  If you expect particular values, replace the relevent It.IsAny<string() calls with those actual vaules.
10
Andy

_It.IsAny_は、テストにプッシュされる内容を制御するReturns()Callback()のコードを照合するために使用されます。

2
Yaur