Ist es bei Moq gültig, mehr als ein Übereinstimmungsargument zu haben?
It.Is<string>()
In diesem Beispiel möchte ich, dass der mockMembershipService je nach angegebenem Benutzer einen anderen ProviderUserKey zurückgibt.
mockMembershipService.Setup(
x => x.GetUser(
It.Is<string>(
s => s.Contains("Joe")))
.ProviderUserKey)
.Returns("1234abcd");
mockMembershipService.Setup(
x => x.GetUser(
It.Is<string>(
s => s.Contains("Tracy")))
.ProviderUserKey)
.Returns("5678efgh");
Das SetUp verwendet standardmäßig die zweite Anweisung, anstatt jede für sich zu bewerten.
c#
unit-testing
mocking
moq
Nicholas Murray
quelle
quelle
Wenn Sie die Eingabe auf "Joe" und "Tracy" beschränken möchten, können Sie in mehrere Bedingungen angeben
It.Is<T>()
. Etwas wiemockMembershipService.Setup(x => x.GetUser(It.Is<String>(s => s.Contains("Joe") || s.Contains("Tracy"))) .Returns<string>(/* Either Bartosz's or Ufuk's answer */);
quelle
Aufeinanderfolgende Setup-Aufrufe machen frühere Setups ungültig.
Sie könnten Ihr Argument in Ihrem Rückruf verwenden:
mockMembershipService.Setup(x => x.GetUser(It.IsAny<string>()).ProviderUserKey).Returns<string>(s => { if(s.Contains("Joe")) return "1234abcd"; else if(s.Contains("Tracy")) return "5678efgh"; });
Wenn es Ihnen wichtig ist, das übergebene Argument zu behaupten, müssen Sie
It.Is<string>(...)
stattdessen stattIt.IsAny<string>(...)
.quelle
ProviderUserKey
), während das Argument, auf das wir reagieren wollen, von kommtGetUser(...)
. Ich kann momentan nicht die richtige Lösung überprüfen, aber wenn Sie den Ratschlägen von Ufuk folgen, sollte es in Ordnung sein ...Bitte überprüfen Sie die Dokumentation zu Einführung in Moq> Übereinstimmende Argumente :
// 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");
quelle