Подтвердить что ты не робот

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

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

Метод Add() ожидает объект UserMetaData, который имеет свойство FirstName.

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

4b9b3361

Ответ 1

Вы можете использовать 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();

Ответ 2

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

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

Ответ 3

Метод 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 вызывается несколько раз, будет проверен только параметр, переданный в последнем вызове (хотя вы можете дополнительно проверить, что он был вызван один раз).

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