我的代码使用了一个组件来实现这样的接口(interface)
public interface IFoo
{
void DoSomething(string p1);
void DoSomething(string p1, Action<string> p2);
}
截至目前,我使用的是第一种方法,但我计划转向第二种方法,并且我希望保持尽可能高的覆盖率。
只是我真的不知道如何检查委托(delegate),甚至不知道如何设置 Moq 来模拟接口(interface)。
我试过
mock.Setup(p => p.DoSomething(It.IsAny<string>(), It.IsAny<Delegate>()));
mock.Setup(p => p.DoSomething(It.IsAny<string>(), It.IsAny<Action<string>>()));
但它们都不会让我 build 。有什么建议吗?
最佳答案
行:
mock.Setup(p => p.DoSomething(It.IsAny<string>(), It.IsAny<Delegate>()));
必须不编译因为DoSomething
需要 Action<string>
, 和 Delegate
不能隐式转换为Action<string>
.你的另一条线:
mock.Setup(p => p.DoSomething(It.IsAny<string>(), It.IsAny<Action<string>>()));
有效且正确!
只能在p2
时设置满足一些标准,例如:
mock.Setup(p => p.DoSomething(It.IsAny<string>(),
It.Is((Action<string> p2) => p2 != null && p2.Target is SomeClass)
));
或者您可以使用 CallBack
检查东西:
mock.Setup(p => p.DoSomething(It.IsAny<string>(), It.IsAny<Action<string>>()))
.CallBack((string p1, Action<string> p2) =>
{
// your code (for example Asserts) here,
// use p2
});
当然,检查 Action<string>
的数量是有限制的,但是你可以看看它是不是非空的,看看它是不是p2.Target
非空或具有特定类型或等于给定实例,您可以查看 p2.Method
是一个已知的(命名的)方法,或者你可以使用 p2.GetInvocationList()
如果您期望所谓的多播委托(delegate)。
关于c# - 使用 Moq 测试接受委托(delegate)的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32594860/