编程语言
首页 > 编程语言> > c#-用Moq测试接受委托的方法

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&gt ;,并且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