wake-up-neo.com

Wie richte ich mit Moq einen Methodenaufruf mit einem Eingabeparameter als Objekt mit erwarteten Eigenschaftswerten ein?

 var storageManager = new Mock<IStorageManager>(); 
 storageManager.Setup(e => e.Add(It.IsAny<UserMetaData>()));

Die Add () -Methode erwartet ein UserMetaData-Objekt mit einer FirstName-Eigenschaft.

Ich möchte sicherstellen, dass ein Objekt vom Typ UserMetaData mit dem Vornamen "Vorname1" übergeben wurde.

32
The Light

Sie können Verify verwenden.

Beispiele:

Stellen Sie sicher, dass Add nie mit UserMetaData mit FirstName! = "FirstName1" Aufgerufen wurde:

storageManager.Verify(e => e.Add(It.Is<UserMetaData>(d => d.FirstName!="FirstName1")), Times.Never());

Stellen Sie sicher, dass Add mindestens einmal mit einem UserMetaData mit FirstName == "FirstName1" Aufgerufen wurde:

storageManager.Verify(e => e.Add(It.Is<UserMetaData>(d => d.FirstName=="FirstName1")), Times.AtLeastOnce());

Stellen Sie sicher, dass Add genau einmal mit FirstName == "Firstname1" Und LastName == "LastName2" Aufgerufen wurde:

storageManager.Setup(e => e.Add(It.Is<UserMetaData>(data => data.FirstName == "FirstName1"
                                                         && data.LastName  == "LastName2")));

...

storageManager.VerifyAll();
49
sloth

Sie können die It.Is-Methode verwenden:

storageManager.Setup(e => e.Add(It.Is<UserMetaData>(data => data.FirstName == "FirstName1")));
11
MatthiasG

Dominic Kexels Methode ist gut und wird funktionieren. Sie können aber auch einen Rückruf verwenden, was nützlich ist, wenn Sie die Ausgabe auf komplizierte Weise überprüfen müssen.

 UserMetaData parameter = null;
 var storageManager = new Mock<IStorageManager>(); 
 storageManager
    .Setup(e => e.Add(It.IsAny<UserMetaData>()))
    .Callback((UserMetaData metaData) => parameter = metaData);

 Assert.That(parameter.FirstName, Is.EqualTo("FirstName1")); //If using fluent NUnit

Dies hat den Vorteil, dass Sie den Parameter bei Bedarf viel häufiger überprüfen können, als nur zu überprüfen, ob es sich um "Vorname1" handelt.

Der Nachteil ist, dass bei mehrmaligem Aufruf von Add nur der beim letzten Aufruf übergebene Parameter überprüft wird (obwohl Sie zusätzlich überprüfen können, ob er einmal aufgerufen wurde).

Dominics Antwort ist für Ihre genaue Situation besser als meine, aber ich wollte auf Callback für andere ähnliche Situationen hinweisen.

8
Andy Nichols