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

想象一下这个class级

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)cking处理程序在Foo的testing中,我将如何检查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))); 

加洛的答案是有效的,但是另一种做法(我认为在testing中更具performance力)是…

 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()); 

validation是非常强大的,值得花时间去习惯。

加洛的答案为我工作,但我想我会扩大约翰·卡彭特的评论,因为我正在寻找一个涉及多个参数的解决scheme。 我想其他人跌倒在这个页面上可能会有类似的情况。 我在Moq文档中find了这个信息。

我将使用Gamlor的例子,但假设AsyncHandle方法有两个参数:一个string和一个SomeResponse对象。

 var mock = new Mock<Handler>(); string stringResult = string.Empty; SomeResponse someResponse = null; mock.Setup(h => h.AsyncHandle(It.IsAny<string>(), It.IsAny<SomeResponse>())) .Callback<string, SomeResponse>((s, r) => { stringResult = s; someResponse = r; }); // do your test new Foo(mock.Object).Bar(22); Assert.AreEqual("expected string", stringResult); Assert.IsNotNull(someResponse); 

基本上你只需要用适当的types添加另一个It.IsAny<>() ,将另一个types添加到Callback方法中,并根据需要更改lambdaexpression式。

你可以使用It.Is<TValue>()匹配器。

var mock = new Mock<Handler>(); new Foo(mock.Object).Bar(22); mock.Verify(h => h.AsyncHandle(It.Is<SomeResponse>(r => r != null )));