使用Moq在C#中验证

时间:2016-01-05 20:33:24

标签: c# unit-testing mocking moq

我正在尝试模拟数据库,以便我可以验证是否已调用save方法。我有一个保存到数据库的项目,它包含要保存的对象列表和连接字符串。

this._database.Save<Constraint>(constraints, "DEFAULT");

当我调试时,我可以看到测试使用模拟数据库成功进入我的项目,并且它恰好一次点击保存行。

在我的测试项目中,我创建了一个调用save方法的类实例,创建并创建了一个模拟数据库,并使用.Setup作为save方法。

private Mock<IDatabase> _mockDatabase;
...
_mockDatabase = new Mock<IDatabase>();
_mockDatabase.Setup(d => d.Save<Types.Constraint>(It.IsAny<Types.Constraint>(), It.IsAny<String>()));

然后在我的测试方法中,我调用.Verify以确保一次调用save。

_mockDatabase.Verify(d => d.Save<Constraint>(It.IsAny<Constraint>(), It.IsAny<String>()), Times.Once);

然而,此验证测试失败。有谁知道我怎么解决这个问题?感谢您的任何帮助/想法!

  

Moq.MockException:
  在模拟上预期调用一次,但是是0次:d =&gt; d.Save(It.IsAny(),It.IsAny())

     

配置设置:
  d =&gt; d.Save(It.IsAny(),It.IsAny()),Times.Never

     

执行调用:
  IDatabase.Save(System.Collections.Generic.List`1 [Types.Constraint],“DEFAULT”)

2 个答案:

答案 0 :(得分:2)

使用您的代码,您发送的内容为List<Constraint>,您期望的是Constraint所以:

将设置更改为:

_mockDatabase.Setup(d => d.Save<Constraint>(It.IsAny<List<Constraint>>(), It.IsAny<String>()));

并验证:

_mockDatabase.Verify(d => d.Save<Constraint>(It.IsAny<List<Constraint>>(), It.IsAny<String>()), Times.Once);

答案 1 :(得分:1)

它使用List<Constraint>而不是Constraint调用save方法,这就是它失败的原因。您可以在调用Save

之前更改预期输入或验证代码