Hallo, ich benutze moq schon eine Weile, wenn ich diesen Code sehe.
Ich muss eine Rendite in einem meiner Repos einstellen.
mockIRole.Setup(r => r.GetSomething(It.IsAny<Guid>(), It.IsAny<Guid>(),
It.IsAny<Guid>())).Returns(ReturnSomething);
Ich habe drei Parameter und ich habe diese gerade in einem Artikel oder Blog im Internet gesehen.
Was ist die Verwendung von It.Is <> oder It.IsAny <> für ein Objekt? Wenn ich Guid.NewGuid () oder andere Typen verwenden könnte, warum dann It.Is?
Es tut mir leid, ich bin mir nicht sicher, ob meine Frage richtig ist oder ob mir beim Testen einige Kenntnisse fehlen. Aber es scheint so oder so nichts auszusetzen.
Mit It.IsAny<>
, It.Is<>
oder eine Variable dienen alle unterschiedlichen Zwecken. Sie bieten immer spezifischere Möglichkeiten, einen Parameter beim Einrichten oder Überprüfen einer Methode abzugleichen.
Die mit It.IsAny<>
stimmt mit jedem Parameter überein, den Sie der Methode geben. In Ihrem Beispiel würden die folgenden Aufrufe alle dasselbe zurückgeben (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);
Es spielt keine Rolle, welcher Wert von Guid
tatsächlich übergeben wurde.
Das It.Is<>
construct ist nützlich zum Einrichten oder Überprüfen einer Methode, wobei Sie eine Funktion angeben können, die mit dem Argument übereinstimmt. Zum Beispiel:
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);
Dies ermöglicht es Ihnen, den Wert mehr als nur einen beliebigen Wert einzuschränken, erlaubt es Ihnen jedoch, in Bezug auf das, was Sie akzeptieren, nachsichtig zu sein.
Wenn Sie einen Methodenparameter mit einer Variablen einrichten (oder überprüfen), möchten Sie gena diesen Wert. Eine mit einem anderen Wert aufgerufene Methode entspricht niemals Ihrer Einrichtung/Überprüfung.
Guid expectedGuids = new [] { Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid() };
mockIRole.Setup(r => r.GetSomething(expectedGuids[0], expectedGuids[1], expectedGuids[2]))
.Returns(ReturnSomething);
Jetzt gibt es genau einen Fall, in dem GetSomething
ReturnSomething
zurückgibt: wenn alle Guid
s mit den erwarteten Werten übereinstimmen, mit denen Sie sie eingerichtet haben.
Schauen Sie sich die Schnellstart-Dokumentation für Moq an
Übereinstimmende Argumente
// 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");