Mock.Verify() 失败 - 此设置不匹配?

ca9*_*3d9 3 c# moq xunit

我有以下测试代码。

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();
Run Code Online (Sandbox Code Playgroud)

测试应该通过。然而,它失败了,错误如下:

  信息:
    Moq.MockException:模拟:
    由于以下原因,该模拟未通过验证:

       IRepository x => x.Save(P):
       此设置不匹配。
  堆栈跟踪:
    模拟.Verify()

sut.M()会将字符串 X 转换为P值为 的类型P(X)

Soe*_*rby 5

在我看来,您想验证模拟中的 Save 方法是否是使用特定值调用的,而不仅仅是类型。

我尝试过类似以下的方法,并相信它应该有效。我已经修改了你的例子。

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(It.IsAny<P>());

var sut = new C(mock.Object);
var result = await sut.M(command);

mock.Verify(x => x.Save(It.Is<P>(v => v.Value.Equals(p.Value))), Times.AtLeastOnce);
Run Code Online (Sandbox Code Playgroud)

这测试特定属性的值是否相等。

我通过以下测试对此进行了测试:

var test = "Test";

var mock = new Mock<ITestRepository>(); // ITestRepository has the method of Save()
var p = new P(test);
mock.Setup(x => x.Save(It.IsAny<P>()));

mock.Object.Save(new P(test));

mock.Verify(x => x.Save(It.Is<P>(v => v.Value.Equals(p.Value))), Times.AtLeastOnce);
Run Code Online (Sandbox Code Playgroud)