使用InternalsVisibleTo来测试私有成员

时间:2014-11-12 12:36:21

标签: c# unit-testing

我有以下代码,我正在尝试单元测试:

class ConfigFile
{

    private XmlDocument configData;

    public ConfigFile()
    {
        configData = new XmlDocument();
    }

    public void loadConfigFile(string filename) 
    {
    }
}

loadConfigFile方法是void,所以我需要检查configData字段以验证其中的数据是否正确。 要做到这一点,我正在尝试使用InternalsVisibleTo属性 - 我已经签署了单元测试DLL,并生成了公钥,所以我现在有:

    [assembly: InternalsVisibleTo("ConfigTests, PublicKey=<PUBLICKEYVALUE>")]
    private XmlDocument configData;

单元测试仍然不想访问私有字段:

    [TestMethod()]
    public void LoadConfigFileTest()
    {
        ConfigFile target = new ConfigFile();
        string filename = @"Config.xml";
        target.loadConfigFile(filename);
        Assert.AreEqual("<config></config>",target.configData.OuterXml);  
    }

Assert.AreEqual(“”,target.configData.OuterXml);我发现以下错误:

'ConfigTests.ConfigFile'不包含'configData'的定义,并且没有扩展方法'configData'接受类型'ConfigTests.ConfigFile'的第一个参数可以找到(你是否缺少using指令或汇编引用? )

我虽然InternalsVisibleTo属性应该允许单元测试访问私有字段......或者我错过了什么?

4 个答案:

答案 0 :(得分:3)

InternalsVisibleTo使您可以从另一个程序集访问内部成员(非私有)。

如果你想测试私有方法,那么你应该问问自己该方法是否应该是私有的,或者该特定方法是否应该是可单独测试的。

答案 1 :(得分:1)

InternalsVisibleTo使所有internal子级对给定程序集可见。

如果要使private方法对于本质上是自相矛盾的另一个程序集可见。这意味着要突破OOD的基础。

单元测试应该测试黑盒的公共API 。也就是说,您的类的设计方式应使您只需测试其公共方法。

  1. 设置方法public

  2. 如果不一定public,则可以将其设置为protected internal,以便可以使用InternalsVisibleTo进行访问

  3. protected internal构成安全威胁,必须通过密封该类及其所有容器类或通过标准安全评估来解决。

如果这没有帮助,请不要对其进行测试,因为它与单元测试无关。测试使用此方法的公共方法。

如果某件东西是私人的,那么从字面上看(用每种编程语言或口语),就意味着其他人都不会关心它!

答案 2 :(得分:0)

我认为您的类ConfigFile具有用于读取配置值的其他公共属性/方法。因此configData是私有的。在这种情况下,您可以对其应用黑盒测试(即对这些值进行断言而不是对整个XmlDocument进行断言)

答案 3 :(得分:0)

更改对内部受保护的访问权限,然后密封课程。这样只有朋友组装才能访问它。