C# 使用Moq,如何将输入参数设置为具有预期属性值的对象的方法调用? var-storageManager=new Mock(); Setup(e=>e.Add(It.IsAny());

C# 使用Moq,如何将输入参数设置为具有预期属性值的对象的方法调用? var-storageManager=new Mock(); Setup(e=>e.Add(It.IsAny());,c#,unit-testing,tdd,moq,C#,Unit Testing,Tdd,Moq,Add()方法需要一个具有FirstName属性的UserMetaData对象 我希望确保已传递名为“FirstName1”的UserMetaData类型的对象。您可以使用验证 示例: 验证从未使用名为的UserMetaData调用Add!=“FirstName1”: 验证是否使用FirstName=“code>”Firstname1“和LastName=“code>”调用了一次Add”=“LastName2”: storageManager.Setup(e=>e.Add(It.Is)(data

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


我希望确保已传递名为“FirstName1”的UserMetaData类型的对象。

您可以使用
验证

示例:

验证从未使用名为
UserMetaData
调用
Add
!=<代码>“FirstName1”

验证是否使用
FirstName
=“code>”Firstname1“
LastName
=“code>”调用了一次
Add
=“LastName2”:

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<UserMetaData>(data => data.FirstName == "FirstName1"
                                                         && data.LastName  == "LastName2")));

...

storageManager.VerifyAll();
storageManager.Setup(e=>e.Add(It.Is(data=>data.FirstName==“FirstName1”));

Dominic Kexel的方法很好,而且会起作用。您也可以使用callback,但如果需要对更复杂的输出进行任何检查,那么它会很有用

storageManager.Setup(e => e.Add(It.Is<UserMetaData>(data => data.FirstName == "FirstName1")));
UserMetaData参数=null;
var storageManager=new Mock();
存储管理器
.Setup(e=>e.Add(It.IsAny()))
.Callback((UserMetaData)=>参数=元数据);
Assert.That(parameter.FirstName,Is.EqualTo(“FirstName1”)//如果使用fluent NUnit
这样做的好处是,如果需要,您可以对参数进行更多的检查,而不仅仅是检查它是否为“FirstName1”

缺点是,如果多次调用Add,则只会检查上次调用中传递的参数(尽管您可以另外验证它是否被调用过一次)


多米尼克的回答比我的回答更适合你的具体情况,但我想指出其他类似情况的回调。

@FaisalHafeez
VerifyAll()
如果你不显式调用
Verify
,而是使用
Setup
来指定你的期望。使用
Setup(…)
VerifyAll()
或仅使用
验证
取决于您的个人偏好以及您的使用案例(您是否使用了使用
设置
?,是否要指定使用
次数
调用函数的频率等)好的,我使用设置(…)和VerifyAll()。通常我正在模拟的函数只调用一次,所以我不使用Verify()。谢谢你的解释,谢谢,看起来很有希望。如果有多个属性,例如LastName、Age等,该怎么办?@Light,如果所有这些都在UserMetaData中,那么您可以使用相同的方法轻松检查它们。我最初的回答有点错误,因为我的断言正在检查参数,应该是parameter.FirstName。
storageManager.Verify(e => e.Add(It.Is<UserMetaData>(d => d.FirstName=="FirstName1")), Times.AtLeastOnce());
storageManager.Setup(e => e.Add(It.Is<UserMetaData>(data => data.FirstName == "FirstName1"
                                                         && data.LastName  == "LastName2")));

...

storageManager.VerifyAll();
storageManager.Setup(e => e.Add(It.Is<UserMetaData>(data => data.FirstName == "FirstName1")));
 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