我的代码正在使用一个实现这样的接口的组件
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>()));
must not编译因为DoSomething
需要一个Action<string>
, and Delegate
is not 隐含地可转换为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
是非 null 或具有特定类型或等于给定实例,您可以查看是否p2.Method
是一种已知(命名)方法,或者您可以使用p2.GetInvocationList()
如果您期望所谓的多播委托。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)