【发布时间】:2019-12-19 22:23:32
【问题描述】:
我有以下测试代码。
var test = "Test";
var command = new MyCommand { V = test };
var mock = new Mock<IRepository>(); // IRepository has the method of Save()
var p = new P(test);
mock.Setup(x => x.Save(p)).Verifiable();
var sut = new C(mock.Object);
var result = await sut.M(command);
mock.Verify();
测试应该通过。但是,它因错误而失败,
信息: Moq.MockException:模拟: 由于以下原因,此模拟验证失败: IRepository x => x.Save(P): 此设置不匹配。 堆栈跟踪: 模拟验证()sut.M() 会将字符串 X 转换为 P 类型,其值为 P(X)。
【问题讨论】:
-
尝试
mock.Setup(x => x.Save(It.IsAny<P>())),否则它期望通过完全相同的P,我怀疑P是否有值相等设置。 -
我没有看到在
x.Save(p)之外的任何地方使用了p。 @juharr 的观点是我的意思。 -
顺便说一句,Moq 可以验证一个方法没有被调用吗?
-
是的,您可以执行
mock.Verify(x => x.Save(It.IsAny<P>(), Times.Never));之类的操作。其他选项包括Once、AtLeastOnce,以及其他指定特定次数或可调用次数范围的选项。 -
您还可以使用
Callback获取参数,以便测试它是否通过P和test值,例如mock.Setup(x => x.Save(It.IsAny<P>())).Callback<P>(p => Assert.Equal(p.Whaterver, test))