Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用InternalsVisibleTo测试私有成员_C#_Unit Testing - Fatal编程技术网

C# 使用InternalsVisibleTo测试私有成员

C# 使用InternalsVisibleTo测试私有成员,c#,unit-testing,C#,Unit Testing,我有以下代码,我正在尝试进行单元测试: class ConfigFile { private XmlDocument configData; public ConfigFile() { configData = new XmlDocument(); } public void loadConfigFile(string filename) { } } loadConfigFile方法无效,因此我需要检查config

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

class ConfigFile
{

    private XmlDocument configData;

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

    public void loadConfigFile(string filename) 
    {
    }
}
loadConfigFile方法无效,因此我需要检查configData字段以验证其中的数据是否正确。 为此,我尝试使用InternalsVisibleTo属性-我已经对单元测试DLL进行了签名,并生成了公钥,因此我现在有:

    [assembly: InternalsVisibleTo("ConfigTests, PublicKey=<PUBLICKEYVALUE>")]
    private XmlDocument configData;
[程序集:InternalsVisibleTo(“ConfigTests,PublicKey=“)]
私有XML文档配置数据;
单元测试仍然不想访问私有字段:

    [TestMethod()]
    public void LoadConfigFileTest()
    {
        ConfigFile target = new ConfigFile();
        string filename = @"Config.xml";
        target.loadConfigFile(filename);
        Assert.AreEqual("<config></config>",target.configData.OuterXml);  
    }
[TestMethod()]
public void LoadConfigFileTest()
{
ConfigFile目标=新的ConfigFile();
字符串文件名=@“Config.xml”;
target.loadConfigFile(文件名);
Assert.AreEqual(“,target.configData.OuterXml”);
}
在Assert.AreEqual(“,target.configData.OuterXml”)上;行中,我得到以下错误:

“ConfigTests.ConfigFile”不包含“configData”的定义,并且找不到接受“ConfigTests.ConfigFile”类型的第一个参数的扩展方法“configData”(是否缺少using指令或程序集引用?)


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

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


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

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

更改对内部受保护类的访问,然后密封该类。这样,只有好友程序集才能访问它

InternalsVisibleTo
使所有
内部
子项对给定程序集可见

如果您想使另一个程序集可以看到一个
private
方法,这本质上是一个悖论。这意味着要打破OOD的基础

单元测试应该测试黑盒的公共API。i、 e.您的类的设计应确保您只需要测试它们的公共方法

  • 将您的方法
    公开


  • 如果它不能
    公开
    ,则可以将其设置为
    受保护的内部
    ,以便可以使用
    内部可视对象访问它

  • 使其
    受内部保护
    会造成安全威胁,必须通过密封该类及其所有容器类或通过标准安全评估来解决

  • 如果这没有帮助,不要测试它,因为它不是单元测试的问题。测试使用此方法的公共方法

    如果某个东西是私有的,它的字面意思(在每种编程语言或口语中)意味着没有其他人关心它


    InternalsVisibleTo
    顾名思义,它只允许访问标记为
    internal
    的内容,对私有/受保护的成员没有影响。不,它允许您访问另一个DLL
    internal
    成员,而不是另一个DLL私有;-)好啊所以我想问题变成了如何测试configData是否有正确的值?它应该保持私有,因为我不希望开发人员直接修改该值。“这样,只有友元程序集才能访问它。”不正确,请参见
    受保护的内部
    :类型或成员可以由声明该类型或成员的程序集中的任何代码访问,也可以从另一个程序集中的派生类中访问。使其
    受保护的内部
    仍将使成员对同一程序集中的任何对象可见。