gpt4 book ai didi

c# - 是否需要调用在 Mock 对象上设置一个方法,我们要验证它是使用 Moq 调用的?

转载 作者:行者123 更新时间:2023-12-04 04:10:31 25 4
gpt4 key购买 nike

我有一个单元测试应该验证在调用 sut.ProcessCommand 时是否调用了特定方法。

设置该方法是否有任何好处,即使我验证它在我的单元测试中被调用。并且要验证的方法不返回任何值,它是 MethodA

中调用的最后一个方法

设置方法的单元测试

 [TestMethod]
Public void VerifyMethodACalled()
{
Mock<ISomeInterfacce> mockObject=new Mock<ISomeInterface>();
mockObject.Setup(mockObj=> mockObj.MethodA(It.Is<ClassA>(classAObj=>classAObj.Name="SomeName")));

//Act
sut.ProcessCommand();

mockObject.Verify(mockObj=> mockObj.MethodA(It.Is<ClassA>(classAObj=>classAObj.Name="SomeName")), Times.Once);

}

不设置方法的单元测试

 [TestMethod]
Public void VerifyMethodACalled()
{
Mock<ISomeInterfacce> mockObject=new Mock<ISomeInterface>();

//Act
sut.ProcessCommand();

mockObject.Verify(mockObj=> mockObj.MethodA(It.Is<ClassA>(classAObj=>classAObj.Name="SomeName")), Times.Once);

}

最佳答案

在示例中,您提供的内容完全没有区别,因为您在两种情况下都根据调用列表验证了方法。


有效地 moq 在内部维护设置方法列表和调用列表。您可以根据调用列表验证该方法,但您也可以验证设置本身。那是什么意思?您可以认为针对调用列表的验证(您提供的示例)实际上是某种延迟验证。让我们看这个例子(也许它不现实但描述了我试图解释的内容)

public class MyData
{
public string Id { get; set; }
}

public interface IMyInterface
{
int MyMethod(MyData data);
}

根据调用列表验证

var p = new Mock<IMyInterface>();
var myData = new MyData {Id = "1"};
p.Object.MyMethod(myData);
myData.Id = "2";
p.Verify(m => m.MyMethod(It.Is<MyData>(d => d.Id == "1"))); //this will fail

验证设置

var p = new Mock<IMyInterface>();
p.Setup(m => m.MyMethod(It.Is<MyData>(d => d.Id == "1"))).Verifiable();
var myData = new MyData {Id = "1"};
p.Object.MyMethod(myData);
myData.Id = "2";
p.Verify(); //this won't fail

关于c# - 是否需要调用在 Mock 对象上设置一个方法,我们要验证它是使用 Moq 调用的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61822005/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com