web-dev-qa-db-ja.com

変数を定義できるのに、なぜIt.is <>またはIt.IsAny <>を使用するのですか?

こんにちは、私はこのコードを見たときにmoqをしばらく使用しています。

リポジトリの1つでリターンを設定する必要があります。

 mockIRole.Setup(r => r.GetSomething(It.IsAny<Guid>(), It.IsAny<Guid>(), 
                  It.IsAny<Guid>())).Returns(ReturnSomething);

3つのパラメーターがあり、ネット上の記事またはブログの1つで見ました。

オブジェクトに対するIt.Is <>またはIt.IsAny <>の使用法は何ですか? Guid.NewGuid()または他のタイプを使用できる場合、なぜIt.Isを使用するのですか?

質問が正しいかどうか、またはテストに関する知識が不足しているのかどうかわかりません。しかし、どちらの方法も間違っていないようです。

31
user1960948

It.IsAny<>It.Is<>、または変数を使用すると、すべて目的が異なります。メソッドをセットアップまたは検証するときに、パラメーターを一致させるための特定の方法がますます提供されます。

It.IsAny

It.IsAny<>で設定されたメソッドは、メソッドに指定したanyパラメーターと一致します。したがって、あなたの例では、次の呼び出しはすべて同じもの(ReturnSomething)を返します。

role.GetSomething(Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid());

Guid sameGuid = Guid.NewGuid();
role.GetSomething(sameGuid, sameGuid, sameGuid);

role.GetSomething(Guid.Empty, Guid.NewGuid(), sameGuid);

渡されたGuidの実際の値は関係ありません。

それは

It.Is<>コンストラクトは、メソッドのセットアップまたは検証に役立ち、引数に一致する関数を指定できます。例えば:

Guid expectedGuid = ...
mockIRole.Setup(r => r.GetSomething(
                 It.Is<Guid>(g => g.ToString().StartsWith("4")), 
                 It.Is<Guid>(g => g != Guid.Empty), 
                 It.Is<Guid>(g => g == expectedGuid)))
         .Returns(ReturnSomething);

これにより、値を単なる値以上に制限することができますが、受け入れるものに寛容になることができます。

変数を定義する

変数を使用してメソッドパラメーターを設定(または検証)するとき、exactlyその値が必要だと言います。別の値で呼び出されたメソッドは、セットアップ/検証と一致しません。

Guid expectedGuids = new [] { Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid() };
mockIRole.Setup(r => r.GetSomething(expectedGuids[0], expectedGuids[1], expectedGuids[2]))
         .Returns(ReturnSomething);

ここで、GetSomethingReturnSomethingを返すケースが1つだけあります。すべてのGuidsが、設定した期待値と一致する場合です。

59
Patrick Quirk

Moqのクイックスタートドキュメント を見ると

一致する引数

// any value
mock.Setup(foo => foo.DoSomething(It.IsAny<string>())).Returns(true);


// matching Func<int>, lazy evaluated
mock.Setup(foo => foo.Add(It.Is<int>(i => i % 2 == 0))).Returns(true); 


// matching ranges
mock.Setup(foo => foo.Add(It.IsInRange<int>(0, 10, Range.Inclusive))).Returns(true); 


// matching regex
mock.Setup(x => x.DoSomething(It.IsRegex("[a-d]+", RegexOptions.IgnoreCase))).Returns("foo");
5
Nkosi