1

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

我有一个ParameterAlgorithmFactory(返回算法以将报告参数计算为 a 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 => x.Execute(new DataSet())

即使我可以调试并看到正在Execute()编辑的行。

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

非常感谢有关此测试失败原因的任何反馈。

4

1 回答 1

3

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

似乎 Moq 比较的是参考而不是“类型”,所以你最终会验证失败。It.IsAny<DataSet>()如果您只需要一个存根参数,这正是应该在这里使用的。

于 2013-09-23T10:00:00.400 回答