使用InternalsVisibleTo测试私有成员

本文关键字:成员 测试 InternalsVisibleTo 使用 | 更新日期: 2023-09-27 18:30:04

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

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"的定义,也找不到接受类型为"ConfigTests.ConfigFile"的第一个参数的扩展方法"configData"(是否缺少using指令或程序集引用?)

我认为InternalsVisibleTo属性应该允许单元测试访问私有字段。。。还是我错过了什么?

使用InternalsVisibleTo测试私有成员

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

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

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

如果您想让private方法对另一个程序集可见,那么这本质上是一个悖论。这意味着打破OOD的基础。

单元测试应该测试黑盒的公共API。也就是说,类的设计方式应该使得需要测试它们的公共方法。

  1. 将您的方法设为public

  2. 如果不能public,则可以将其设为protected internal,以便使用InternalsVisibleTo 可以访问它

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

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

如果某件事是私人的,它(在每一种编程或口语中)意味着没有人关心它!

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

将访问权限更改为内部保护,然后密封类。这样只有友元程序集才能访问它。