C# 测试使用Moq接受委托的方法

C# 测试使用Moq接受委托的方法,c#,unit-testing,delegates,moq,C#,Unit Testing,Delegates,Moq,我的代码使用一个组件来实现这样的接口 public interface IFoo { void DoSomething(string p1); void DoSomething(string p1, Action<string> p2); } 公共接口IFoo { 无效剂量测定(字符串p1); 无效剂量测定(串p1,动作p2); } 目前为止,我正在使用第一种方法,但我计划转移到第二种方法,我希望保持尽可能高的覆盖率 只是我真的不知道如何检查委托,甚至不知

我的代码使用一个组件来实现这样的接口

public interface IFoo 
{ 
    void DoSomething(string p1);

    void DoSomething(string p1, Action<string> p2);
}
公共接口IFoo
{ 
无效剂量测定(字符串p1);
无效剂量测定(串p1,动作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(),It.IsAny());
mock.Setup(p=>p.DoSomething(It.IsAny(),It.IsAny());
但他们都不会让我建造。有什么建议吗?

行:

mock.Setup(p => p.DoSomething(It.IsAny<string>(), It.IsAny<Delegate>()));
有效且正确

只有当
p2
满足某些条件时,才能进行设置,例如:

mock.Setup(p => p.DoSomething(It.IsAny<string>(),
    It.Is((Action<string> p2) => p2 != null && p2.Target is SomeClass)
    ));

当然,可以检查
操作的数量是有限制的,但是您可以查看它是否为非空,查看它的
p2.Target是否为非空,或者是否具有特定类型或与给定实例相等,可以查看
p2.Method
是否为已知(命名)方法,或者可以使用
p2.GetInvocationList()
如果你希望得到一个所谓的多播委托。

我不想用明显的code=)来夸大文章的内容,但是不要夸大,但是关于哪些内容不起作用的一些细节(是否存在编译错误?如果有,你可以发布吗?)会有帮助。你的
mock.Setup(…
行不平衡(它们缺少Setup()的关闭参数)。这只是复制粘贴错误吗?当我修复该错误时,您的第二行(It.IsAny())对我来说效果很好。这是一个复制粘贴错误。事实上,现在它已经生成了。尽管如此,能够对操作的内容进行某种断言还是很有趣的。但是这会给你什么?当你有其他方法条在测试时,你会嘲笑IFoo,你知道Bar将调用
This.myFoo.DoSomething(“Bar”),我的行动);
对于Bar上的测试,Foo对象对传递给它的操作做了什么并不重要;IFoo不返回任何数据。您是否依赖于代码中调用
DoSomething的操作p2的副作用?
?谢谢!您的回答给了我一个帮助我解决问题的想法。我所做的只是提取一个在测试中,我只是验证了第二个服务是否被正确调用。
mock.Setup(p => p.DoSomething(It.IsAny<string>(),
    It.Is((Action<string> p2) => p2 != null && p2.Target is SomeClass)
    ));
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
    });