在 C# 中使用 Moq 验证

Using Moq to verify in C#

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

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

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

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

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

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

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

但是此验证测试失败。有谁知道我该如何解决这个问题?感谢任何 help/ideas!

Moq.MockException:
Expected invocation on the mock once, but was 0 times: d => d.Save(It.IsAny(), It.IsAny())

Configured setups:
d => d.Save(It.IsAny(), It.IsAny()), Times.Never

Performed invocations:
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

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