模拟测试以在参数中传递函数引用

时间:2018-02-05 01:42:34

标签: c# unit-testing mocking moq

我有类似A类的功能:

private async Task<T> Refresh(int a, string x)
{

// do something.. modify x
return x;
}

现在,这个函数基本上是同一个类A中另一个函数的参数。

classBobject.Get("somestring",(returnvalue) => Refresh(a,returnvalue));

我的模拟看起来像:

classBmockObject.Setup(classAmock => classAmock.Get<T>("somestring",(returnvalue) => Refresh(a, returnvalue))).ReturnsAsync(someotherobject);

但是,这需要我在测试类中再次创建一个名为Refresh的新函数。

现在我不知道如何编写模拟单元测试用例来测试b.get()方法。 如何在不在测试类中重新编写函数体的情况下传递第3个参数?

2 个答案:

答案 0 :(得分:1)

通过将以下第3个参数传递给Get方法来解决此问题。

It.IsAny <Func<T, Task<T>>

所以看起来像:

classBmockObject.Setup(classAmock => classAmock.Get<T>("somestring",It.IsAny <Func<T, Task<T>>())).ReturnsAsync(someotherobject); 

谢谢大家。

答案 1 :(得分:0)

您可以为A类和AMock类声明一个公共基类。

这通常很有用,如果他们应该做同样的事情,但也允许你的测试错过了Refresh方法中的错误隐藏的错误,因为你的测试不再独立于它正在测试的代码。

此外,如果第三个列表不在A / AMock类中,您可能只想使用=> classAmock.Refresh(而不是=> Refresh(,如果可见性允许的话。