Moq:如何获得传递给模拟服务的方法的参数

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (16)

想象一下这堂课

public class Foo {

    private Handler _h;

    public Foo(Handler h)
    {
        _h = h;
    }

    public void Bar(int i)
    {
        _h.AsyncHandle(CalcOn(i));
    }

    private SomeResponse CalcOn(int i)
    {
        ...;
    }
}

Mo(Q)在foo测试中如何检查Bar()已经转到_h.AsyncHandle?

提问于
用户回答回答于

你可以使用Mock.Callback-方法:

var mock = new Mock<Handler>();
SomeResponse result = null;
mock.Setup(h => h.AnsyncHandle(It.IsAny<SomeResponse>()))
    .Callback<SomeResponse>(r => result = r);

// do your test
new Foo(mock.Object).Bar(22);
Assert.NotNull(result);

如果只想在传递的参数上检查一些简单的内容,也可以直接进行:

mock.Setup(h => h.AnsyncHandle(It.Is<SomeResponse>(response => response != null)));
用户回答回答于

另一种方法(我认为在测试中表现得更有表现力)是

var mock = new Mock<Handler>();
var desiredParam = 47; // this is what you want to be passed to AsyncHandle
new Foo(mock.Object).Bar(22);
mock.Verify(h => h.AsyncHandle(desiredParam), Times.Once());

验证功能非常强大,值得花时间去适应。

扫码关注云+社区