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