使用Moq,我如何将输入参数设置为具有预期属性值的对象的方法调用
本文关键字:属性 方法 对象 调用 Moq 设置 参数 输入 使用 | 更新日期: 2023-09-27 18:08:07
var storageManager = new Mock<IStorageManager>();
storageManager.Setup(e => e.Add(It.IsAny<UserMetaData>()));
Add()方法需要一个具有FirstName属性的UserMetaData对象。
我想确保UserMetaData类型的对象与FirstName的"FirstName1"已经传递。
您可以使用Verify
例子:
验证Add
从未被FirstName
= "FirstName1"
:
UserMetaData
调用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();
您可以使用It。方法:
storageManager.Setup(e => e.Add(It.Is<UserMetaData>(data => data.FirstName == "FirstName1")));
斯洛斯的方法很好,而且会奏效。你也可以使用callback,但是如果你需要对输出做一些更复杂的检查,它是很有用的。
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的答案比我的更好,但我想指出Callback适用于其他类似的情况。