2013-04-08 2 views
25

Использование Moq, Как настроить вызов метода с входным параметром в качестве объекта с ожидаемыми значениями свойств?Использование Moq, Как настроить вызов метода с входным параметром в качестве объекта с ожидаемыми значениями свойств?

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

Метод Add() предполагает объект UserMetaData, обладающий свойством FirstName.

Я хотел бы убедиться, что объект типа UserMetaData с именем FirstName1 был передан.

ответ

40

Вы можете использовать Verify.

Примеры:

Убедитесь, что Add никогда не вызывается с UserMetaData с FirstName = "FirstName1":

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

Убедитесь, что Add называли по крайней мере, один раз с UserMetaData с FirstName == "FirstName1" :

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

Убедитесь, что Add был назван только один раз с FirstName == "Firstname1" и LastName == "LastName2":

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

... 

storageManager.VerifyAll(); 
+0

sotrageManager.VerifyAll(); Будет ли это работать? –

+0

@FaisalHafeez 'VerifyAll()' было бы полезно, если вы не вызываете 'Verify' явно, но используйте' Setup', чтобы указать ваше ожидание. – sloth

+2

Использование 'Setup (....)' и 'VerifyAll()' или только с помощью 'Verify' зависит от ваших личных предпочтений, а также от вашего прецедента (вы используете возвращаемое значение функции, настроенной с помощью' Setup' ?, вы хотите указать, как часто функция должна вызываться с помощью 'Times' ?, и т. д.) – sloth

6

Вы можете использовать метод It.Is:

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

метод Dominic Kexel является хорошим и будет работать. Вы также можете использовать обратный вызов, хотя это полезно, если вам нужно выполнить какую-либо проверку более сложного результата.

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 

Преимущество этого в том, что, в случае необходимости, вы можете сделать много больше проверок на параметр, а не просто проверить, что это «FIRSTNAME1».

Недостаток заключается в том, что если Add вызывается несколько раз, будет проверяться только параметр, прошедший в последнем вызове (хотя вы можете дополнительно проверить, что он был вызван один раз).

Ответ Доминика лучше, чем у меня для вашей точной ситуации, но я хотел указать обратный звонок для других подобных ситуаций.

+0

спасибо, что выглядит многообещающим. Что делать, если имеется более одного свойства, например. LastName, Age и т. Д.? –

+0

@ The Light. Если все это в UserMetaData, вы можете легко их легко проверить, используя тот же метод. Мой первоначальный ответ был немного неправильным в том, что мой Assert проверял параметр и должен был быть параметром. FirstName. –

Смежные вопросы