こんにちは、私はこのコードを見たときに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を使用するのですか?
質問が正しいかどうか、またはテストに関する知識が不足しているのかどうかわかりません。しかし、どちらの方法も間違っていないようです。
It.IsAny<>
、It.Is<>
、または変数を使用すると、すべて目的が異なります。メソッドをセットアップまたは検証するときに、パラメーターを一致させるための特定の方法がますます提供されます。
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);
ここで、GetSomething
がReturnSomething
を返すケースが1つだけあります。すべてのGuid
sが、設定した期待値と一致する場合です。
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");