测试接受Moq委托的方法

时间:2015-09-15 20:16:36

标签: c# unit-testing delegates 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>>()));

但不会让我建立。有什么建议吗?

1 个答案:

答案 0 :(得分:3)

该行:

from lxml import etree
import re

xml = '''<?xml version="1.0"?>
<data>
<Connector
protocol="org.apache.coyote.http11.Http11NioProtocol"
port="443"
redirectPort="443"
executor="tomcatThreadPool"
disableUploadTimeout="true"
SSLEnabled="true"
scheme="https"
secure="true"
clientAuth="false"
sslEnabledProtocols="TLSv1,TLSv1.1,TLSv1.2"
keystoreType="JKS"
keystoreFile="tomcat.keystore"
keystorePass="XXXXX"
server="XXXX"
ciphers="TLS_DHE_RSA_WITH_AES_128_CBC_SHA,
         TLS_DH_RSA_WITH_AES_128_CBC_SHA,
         TLS_DHE_DSS_WITH_AES_128_CBC_SHA,
         TLS_DH_DSS_WITH_AES_128_CBC_SHA,
         TLS_RSA_WITH_AES_128_CBC_SHA,
         TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA,
         TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA,
         TLS_RSA_WITH_3DES_EDE_CBC_SHA,
         TLS_RSA_WITH_RC4_128_SHA"
address="192.168.10.6"></Connector></data>'''

tree = etree.fromstring(xml)
root = tree.getroottree().getroot()
for connector in root.findall('Connector'):
    port = connector.get('port')
    ip = connector.get('address')
    #change this to port/ip you want to remove
    if port != '443' or ip != '192.168.10.6':
        #removes child connector
        connector.getparent().remove(connector)
        continue
    #here we use list comprehension to remove any cipher with "RC4"
    ciphers = ','.join([x for x in re.split(r',\s*', connector.get('ciphers')) if 'RC4' not in x])
    #set the modified cipher back
    connector.set('ciphers', ciphers)
print etree.tostring(root, pretty_print=True)

必须编译,因为mock.Setup(p => p.DoSomething(It.IsAny<string>(), It.IsAny<Delegate>())); 需要DoSomethingAction<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是否是已知(命名)方法,或者如果您期望所谓的多播委托,则可以使用p2.Method