是否需要调用在 Mock 对象上设置一个方法,我们要验证它是使用 Moq 调用的?
Is a call needed to Setup a method on Mock object that we want to Verify that it is called using Moq?
我有一个单元测试应该验证在调用 sut.ProcessCommand.
时调用了特定方法
设置该方法是否有任何好处,即使我验证它在我的单元测试中被调用。并且要验证的方法没有 return 任何值,它是 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
我有一个单元测试应该验证在调用 sut.ProcessCommand.
时调用了特定方法设置该方法是否有任何好处,即使我验证它在我的单元测试中被调用。并且要验证的方法没有 return 任何值,它是 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