使用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"已经传递。

使用Moq,我如何将输入参数设置为具有预期属性值的对象的方法调用

您可以使用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适用于其他类似的情况。