在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")
对于您的代码,您发送的是一个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
之前,您可以更改预期输入或验证代码