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

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

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

Add()方法需要具有FirstName属性的UserMetaData对象。

我想确保传递了具有FirstName为“FirstName1”的UserMetaData类型的对象。

您可以使用Verify

例子:

validation是否从未使用带有FirstNameUserMetaData调用Add != "FirstName1"

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

使用带有FirstName == "FirstName1"UserMetaDatavalidation是否至少调用了一次UserMetaData

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

使用FirstName == "Firstname1"LastName == "LastName2"validationAdd是否只调用了一次:

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

您可以使用It.Is方法:

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

Dominic Kexel的方法很好并且可行。 您也可以使用回调,但如果您需要检查更复杂的输出,则回调非常有用。

  UserMetaData parameter = null; var storageManager = new Mock(); storageManager .Setup(e => e.Add(It.IsAny())) .Callback((UserMetaData metaData) => parameter = metaData); Assert.That(parameter.FirstName, Is.EqualTo("FirstName1")); //If using fluent NUnit 

这样做的好处是,如果需要,您可以对参数进行更多检查,而不仅仅是检查它是否为“FirstName1”。

缺点是如果多次调用Add,那么将只检查在最后一次调用中传递的参数(尽管您可以另外validation它是否被调用过一次)。

Dominic的回答比我的回答要好,但是我想指出其他类似情况的Callback。