c#-用Moq测试接受委托的方法
作者:互联网
我的代码正在使用实现这样的接口的组件
public interface IFoo
{
void DoSomething(string p1);
void DoSomething(string p1, Action<string> p2);
}
到目前为止,我正在使用第一种方法,但是我计划移至第二种方法,并且我希望保持尽可能高的覆盖率.
只是我真的不知道如何检查委托,甚至不设置Moq来模拟接口.
我尝试过
mock.Setup(p => p.DoSomething(It.IsAny<string>(), It.IsAny<Delegate>()));
mock.Setup(p => p.DoSomething(It.IsAny<string>(), It.IsAny<Action<string>>()));
但没有一个能让我建立.有什么建议吗?
解决方法:
该行:
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>的数量是有限制的,但是您可以查看它是否为非null,查看其p2.Target是否为非null或具有特定类型或等于给定实例,您可以查看p2.Method是否是已知的(命名的)方法,或者如果期望使用所谓的多播委托,则可以使用p2.GetInvocationList().
标签:unit-testing,moq,delegates,c 来源: https://codeday.me/bug/20191119/2038362.html