在C#中使用Moq进行验证

本文关键字:验证 Moq | 更新日期: 2023-09-27 18:29:02

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

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

当我调试时,我可以看到测试成功地进入了我的项目,并使用了一个模拟数据库,并且它只命中了一次保存行。

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

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

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

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

然而,该测试在此验证中失败。有人知道我该怎么解决吗?感谢您的帮助/想法!

Moq.MockException:
应调用mock一次,但调用次数为0次:d=>d.Save(It.IsAny(),It.IsAy())

配置的设置:
d=>d.Save(It.IsAny(),It.IsAy()),Times.Never

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

在C#中使用Moq进行验证

对于您的代码,您发送的是一个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);

它使用List<Constraint>而不仅仅是Constraint调用save方法,这就是它失败的原因。在调用Save 之前,您可以更改预期输入或验证代码