我正在使用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 ?
对于此测试失败原因的任何反馈都表示赞赏。
答案 0 :(得分:3)
正如我在评论中提到的,您应该使用It.IsAny<DataSet>()
代替new DataSet()
作为验证参数。
Moq似乎比较了引用而不是“类型”,因此最终会导致验证失败。如果你只想要一个存根参数,那么It.IsAny<DataSet>()
就是这里应该使用的。