在返回的mock上调用了验证方法

时间:2013-09-23 09:46:21

标签: c# .net unit-testing mocking moq

我正在使用Moq对我的工厂进行单元测试,并随后执行它的产品。

我有ParameterAlgorithmFactory(返回算法以将报告参数计算为IVisibilityParameterAlgorithm)以及工厂内的方法,每个方法调用Execute()

为了测试这个,我写了一个像这样的单元测试:

//Verfiy that execute is called on all algorithms produced by factory
[TestMethod]
public void ParameterAlgorithmFactory_ReturnedAlgorithm_ExpectExceuteCalled()
{
    var mockFactory = new Mock<IParameterAlgorithmFactory>();
    var parameterAlgorithm = new Mock<IVisibilityParameterAlgorithm>();

    mockFactory.Setup(x => x.Create(LineType.Adjustment)).Returns(parameterAlgorithm.Object);

    new ReportParameters().CreateParameters(new DataSet(), mockFactory.Object);

    parameterAlgorithm.Verify(x=> x.Execute(new DataSet()));
 }

正如你所看到的,我正在从我的模拟工厂返回一个模拟算法(parameterAlgorithm),然后我想要调用它Execute()

然而,我一直得到:

  

Moq.MockException:模拟上的预期调用至少一次,但是   从未执行过:x =&gt; x.Execute(new DataSet())

即使我可以调试Execute()

也许我在我的工厂做了太多事情(返回一个算法并执行它)或者我正在以错误的方式使用Moq

对于此测试失败原因的任何反馈都表示赞赏。

1 个答案:

答案 0 :(得分:3)

正如我在评论中提到的,您应该使用It.IsAny<DataSet>()代替new DataSet()作为验证参数。

Moq似乎比较了引用而不是“类型”,因此最终会导致验证失败。如果你只想要一个存根参数,那么It.IsAny<DataSet>()就是这里应该使用的。