Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否需要调用来在模拟对象上设置方法,以验证是否使用Moq调用了该方法?_C#_Unit Testing_Moq - Fatal编程技术网

C# 是否需要调用来在模拟对象上设置方法,以验证是否使用Moq调用了该方法?

C# 是否需要调用来在模拟对象上设置方法,以验证是否使用Moq调用了该方法?,c#,unit-testing,moq,C#,Unit Testing,Moq,我有一个单元测试,它应该验证在调用sut.ProcessCommand时是否调用了特定的方法 即使我验证了在单元测试中调用了该方法,设置该方法是否有任何好处。要验证的方法不会返回任何值,它是在MethodA 设置方法的单元测试 [TestMethod] Public void VerifyMethodACalled() { Mock<ISomeInterfacce> mockObject=new Mock<ISomeInterface>(); mock

我有一个单元测试,它应该验证在调用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);

 }

[TestMethod]
Public void VerifyMethodACalled()
{ 
Mock mockObject=new Mock();
mockObject.Setup(mockObj=>mockObj.MethodA(It.Is(classAObj=>classAObj.Name=“SomeName”));
//表演
sut.ProcessCommand();
mockObject.Verify(mockObj=>mockObj.MethodA(It.Is(classAObj=>classAObj.Name=“SomeName”)),Times.one);
}
不设置方法的单元测试

 [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);

 }

[TestMethod]
Public void VerifyMethodACalled()
{ 
Mock mockObject=new Mock();
//表演
sut.ProcessCommand();
mockObject.Verify(mockObj=>mockObj.MethodA(It.Is(classAObj=>classAObj.Name=“SomeName”)),Times.one);
}

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


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

对照调用列表进行验证

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();
var myData=newmydata{Id=“1”};
p、 MyMethod(myData);
myData.Id=“2”;
p、 验证(m=>m.MyMethod(It.Is(d=>d.Id==“1”))//这将失败
对照设置进行验证

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
var p=new Mock();
p、 设置(m=>m.MyMethod(It.Is(d=>d.Id==“1”))).Verifiable();
var myData=newmydata{Id=“1”};
p、 MyMethod(myData);
myData.Id=“2”;
p、 验证()//这不会失败的

如果您只是验证调用是否发生,则不需要单独设置。您的第二个测试看起来不错,作为一个选项,您可以在第一个选项中的
Setup()
之后进行
Verifiable()
。如果mock不需要设置,那么第二个选项将是fine,而在提供的示例中没有显示。假设mock被注入到SUT中。也许您想激活mock的callbase属性?mockObject.CallBase=true@Rahul听起来不错,经过几次尝试和调试,似乎没有必要设置,而单元测试是关于验证相同的方法。感谢@Johnny的回答,我的问题比你添加的更简单,但你的回答是我以前不知道的额外信息。