it-swarm.com.de

Warum It.is <> oder It.IsAny <> verwenden, wenn ich nur eine Variable definieren könnte?

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.

31
user1960948

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.

It.IsAny

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.

Es ist

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.

Eine Variable definieren

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 GetSomethingReturnSomething zurückgibt: wenn alle Guids mit den erwarteten Werten übereinstimmen, mit denen Sie sie eingerichtet haben.

59
Patrick Quirk

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");
5
Nkosi