【发布时间】:2013-09-23 09:46:21
【问题描述】:
我正在使用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 => x.Execute(new DataSet())
尽管我可以调试并看到Execute()ed 的行。
也许我在工厂里做的太多(返回一个算法并执行它),或者我以错误的方式使用 Moq?
非常感谢任何有关此测试失败原因的反馈。
【问题讨论】:
-
您可能应该使用
It.IsAny<DataSet>()而不是new DataSet()- 验证可能对参数使用引用相等而不是“类型”/存根相等。 -
可以提供
ReportParameters.CreateParameters的详细信息吗?你确定你用LineType.Adjustment作为参数调用Create吗? -
@PatrykĆwiek - 看起来
It.IsAny<DataSet>()成功了!我会阅读这方面的内容,以便将来理解和使用。如果你想写这个作为答案,我会接受。 -
@m.edmondson 完成! :)
标签: c# .net unit-testing mocking moq