想象一下这门课
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 Handler在Foo的测试中,我如何能够检查什么Bar()已传递给_h.AsyncHandle?
这里有很多很好的答案!使用开箱即用的Moq特性集,直到需要对传递给依赖项的几个类参数进行断言。如果你最终在这种情况下,它的Moq验证功能。Is匹配器在隔离测试失败方面做得不好,捕获参数的Returns/Callback方式在测试中添加了不必要的代码行(长时间的测试对我来说是不可取的)。
这里有一个要点:https://gist.github.com/Jacob-McKay/8b8d41ebb9565f5fca23654fd944ac6b,我写了一个Moq(4.12)扩展,它提供了一种更声明性的方式来对传递给mock的参数进行断言,没有前面提到的缺点。下面是验证部分现在的样子:
mockDependency
.CheckMethodWasCalledOnce(nameof(IExampleDependency.PersistThings))
.WithArg<InThing2>(inThing2 =>
{
Assert.Equal("Input Data with Important additional data", inThing2.Prop1);
Assert.Equal("I need a trim", inThing2.Prop2);
})
.AndArg<InThing3>(inThing3 =>
{
Assert.Equal("Important Default Value", inThing3.Prop1);
Assert.Equal("I NEED TO BE UPPER CASED", inThing3.Prop2);
});
如果Moq提供了一个功能,既能完成同样的事情,又能提供声明性的故障隔离,我会很兴奋。祈祷!