是否需要调用在 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