Используя Moq, как мне настроить вызов метода с входным параметром в качестве объекта с ожидаемыми значениями свойств?
var storageManager = new Mock<IStorageManager>();
storageManager.Setup(e => e.Add(It.IsAny<UserMetaData>()));
Метод Add() ожидает объект UserMetaData, который имеет свойство FirstName.
Я хотел бы убедиться, что объект типа UserMetaData с FirstName "FirstName1" был передан.
Ответы
Ответ 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 лучше, чем мой для вашей точной ситуации, но я хотел указать на обратный вызов для других подобных ситуаций.