2013-04-08 7 views
25

Utilizzo di Moq, Come impostare una chiamata di metodo con un parametro di input come oggetto con valori di proprietà previsti?Utilizzo di Moq, Come impostare una chiamata di metodo con un parametro di input come oggetto con valori di proprietà previsti?

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

Il metodo Add() prevede un oggetto UserMetaData con proprietà FirstName.

Mi piacerebbe essere sicuro che un oggetto di tipo UserMetaData con il FirstName di "FirstName1" sia stato passato.

risposta

40

È possibile utilizzare Verify.

Esempi:

verificare che Add non è mai stato chiamato con una UserMetaData con FirstName = "FirstName1":!

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

verificare che Add è stato chiamato almeno una volta con un UserMetaData con FirstName == "FirstName1" :

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

Verificare che Add si chiamava esattamente una volta con FirstName == "Firstname1" e LastName == "LastName2":

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

... 

storageManager.VerifyAll(); 
+0

sotrageManager.VerifyAll(); Funzionerà? –

+0

@FaisalHafeez 'VerifyAll()' sarebbe utile se non chiami esplicitamente 'Verify', ma usi' Setup' per specificare le tue aspettative. – sloth

+2

Usando 'Setup (....)' e 'VerifyAll()' o solo usando 'Verifica 'dipende dalle preferenze personali e anche dal tuo caso d'uso (Usi il valore di ritorno della funzione che hai configurato con' Setup' ?, vuoi specificare con quale frequenza deve essere richiamata una funzione con 'Times' ?, ecc.) – sloth

6

È possibile utilizzare il metodo It.Is:

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

metodo di Dominic Kexel è buono e funzionerà. È anche possibile utilizzare la funzione di callback, che è utile se è necessario eseguire un controllo dell'output più complicato.

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 

Il vantaggio di questo è che, se necessario, si possono fare molte più controlli sul parametro piuttosto che solo controllando che si tratta di "FIRSTNAME1".

Lo svantaggio è che se Add viene chiamato più volte, verrà controllato solo il parametro passato nell'ultima chiamata (sebbene sia possibile verificare anche che sia stato chiamato una volta).

La risposta di Dominic è migliore della mia per la tua precisa situazione ma volevo segnalare Callback per altre situazioni simili.

+0

, sembra promettente. Che cosa succede se ci sono più di una proprietà, ad es. LastName, Age, ecc.? –

+0

@The Light, se tutti questi sono in UserMetaData, puoi controllarli tutti con facilità usando lo stesso metodo. La mia risposta originale era leggermente errata in quanto il mio Assert stava controllando il parametro e avrebbe dovuto essere parameter.FirstName. –

Problemi correlati