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