2013-04-08 7 views
25

Korzystanie z Moq, Jak ustawić wywołanie metody z parametrem wejściowym jako obiekt o oczekiwanych wartościach właściwości?Korzystanie z Moq, Jak ustawić wywołanie metody z parametrem wejściowym jako obiekt o oczekiwanych wartościach właściwości?

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

Metoda add() oczekuje, że obiekt UserMetaData ma własność FirstName.

Chciałbym się upewnić, że obiekt typu UserMetaData z FirstName "FirstName1" został przekazany.

Odpowiedz

40

Można użyć Verify.

Przykłady:

Weryfikuj że Add nigdy nazwano z UserMetaData z FirstName = "FirstName1":

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

Weryfikuj że Add nazwano co najmniej raz z UserMetaData z FirstName == "FirstName1" :

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

Sprawdź, Add nazwano dokładnie raz FirstName == "Firstname1" i LastName == "LastName2":

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

... 

storageManager.VerifyAll(); 
+0

sotrageManager.VerifyAll(); Czy to zadziała? –

+0

@FaisalHafeez 'VerifyAll()' byłby użyteczny, jeśli nie wywołasz bezpośrednio 'Verify', ale użyj' Setup', aby określić swoje oczekiwania. – sloth

+2

Używanie 'Setup (....)' i 'VerifyAll()' lub używanie tylko 'Verify' zależy od twoich osobistych preferencji, a także od twojego przypadku użycia (Czy używasz wartości zwracanej przez funkcję skonfigurowaną przez' Setup' ?, czy chcesz określić, jak często funkcja powinna być wywoływana za pomocą 'Times' ?, itd.) – sloth

6

można wykorzystać metodę It.Is:

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

metoda Dominic Kexel jest dobra i będzie działać. Możesz także użyć wywołania zwrotnego, co jest przydatne, jeśli musisz wykonać jakieś sprawdzenie wyjścia, które jest bardziej skomplikowane.

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 

Zaletą jest to, że jeśli jest to wymagane, można zrobić wiele więcej kontroli na parametr, a nie tylko sprawdzenie, czy jest to „FIRSTNAME1”.

Wadą jest to, że jeśli funkcja Add zostanie wywołana wiele razy, to zostanie sprawdzony tylko parametr przekazany podczas ostatniego połączenia (chociaż można dodatkowo sprawdzić, czy został on wywołany raz).

Odpowiedź Dominika jest lepsza niż moja dla twojej dokładnej sytuacji, ale chciałem wskazać Callback dla innych podobnych sytuacji.

+0

dzięki, że wygląda obiecująco. Co jeśli istnieje więcej niż jedna nieruchomość, np. LastName, Age, etc? –

+0

@ Light, jeśli wszystko to znajduje się w UserMetaData, możesz je wszystkie łatwo sprawdzić za pomocą tej samej metody. Moja oryginalna odpowiedź była nieco błędna, ponieważ mój Assert sprawdzał parametr i powinien być parametrem. NazwaPierwsza. –

Powiązane problemy