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

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

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

4

3 回答 3

54

您可以使用Verify.

例子:

验证Add从未使用UserMetaDatawith FirstName!=调用过"FirstName1"

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

使用with ==验证Add至少调用了一次:UserMetaDataFirstName"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();
于 2013-04-08T12:51:55.007 回答
16

您可以使用 It.Is 方法:

storageManager.Setup(e => e.Add(It.Is<UserMetaData>(data => data.FirstName == "FirstName1")));
于 2013-04-08T12:52:59.850 回答
12

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 被多次调用,那么只会检查最后一次调用中传递的参数(尽管您可以另外验证它是否被调用过一次)。

对于您的确切情况,多米尼克的回答比我的要好,但我想指出其他类似情况的回调。

于 2013-04-08T13:36:30.477 回答