c# - 使用 Moq 测试接受委托(delegate)的方法

标签 c# unit-testing delegates moq

我的代码使用了一个组件来实现这样的接口(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/

相关文章:

c# - ASP.NET Core 2.2 JWT 认证

c# - 当 Controller 位于 asp.net 核心应用程序的单独程序集中时,为什么 TestServer 无法找到 Controller ?

unit-testing - PHPunit 调用魔术方法

ios - 从未调用过的交互式委托(delegate)方法

c# - 委托(delegate)中的方法参数

c# - WPF 网格不垂直拉伸(stretch)

c# - 控制台状态栏

c# - 在没有管道功能的情况下,在格式字符串漏洞中输入地址的技巧是什么?

ruby-on-rails - 你最喜欢的 ruby​​ 和 rails 测试 "gem(s)"或 "plugins"

c# - 在 C# 中,为什么我不能测试事件处理程序在其定义的类之外的任何位置是否为 null?