如何验证 Moq 中的对象类型参数

bom*_*bek 3 c# unit-testing moq

我想使用匿名参数测试方法执行,但使用已知属性。

public interface IToTest
{
   void MethodToTest(object data);
}
Run Code Online (Sandbox Code Playgroud)

这就是我尝试实现这一目标的方法:

Mocker.Mock<IToTest>
   .Verify(x=>x.MethodToTest(
      It.Is<object>(
         obj=>obj.Equals(new { DataProperty = "Test"})
      )),
      Times.Once());
Run Code Online (Sandbox Code Playgroud)

测试未通过。

我不想使用

It.IsAny<object>()
Run Code Online (Sandbox Code Playgroud)

因为我知道预期数据。

Nko*_*osi 7

您将需要在委托中使用反射来进行比较,或者使用类似的东西FluentAssertions来减轻繁重的工作

例如

//...

var expected = new { 
    DataProperty = "Test" 
    //...known properties
};

Func<object, bool> match = _ => {
    _.Should().BeEquivalentTo(expected);
    return true;
};

Mocker.Mock<IToTest>
    .Verify(x =>
        x.MethodToTest(It.Is<object>(obj => match(obj))),
        Times.Once());
Run Code Online (Sandbox Code Playgroud)

或者,您可以在回调中捕获对象参数,然后使用流畅的断言来断言捕获的参数。