我试图在.net中单元测试一个私有函数。这个私有函数返回一个类型为myClass
的集合,这是一个内部类。InternalsVisibleTo似乎被忽略
我已经使用程序集属性InternalsVisibleTo
,因此myClass
类型对我的测试项目是已知的。
这是我想测试代码:
namespace MyProject
{
public class Class1
{
private List<myClass> myFunction()
{
return new List<myClass>();
}
internal class myClass
{
public int MyProperty { get; set; }
}
}
}
[TestMethod()]
[DeploymentItem("MyProject.dll")]
public void myFunctionTest()
{
Class1_Accessor target = new Class1_Accessor();
List<Class1_Accessor.myClass> expected = null;
List<Class1_Accessor.myClass> actual;
actual = target.myFunction();
Assert.AreEqual(expected, actual);
Assert.Inconclusive("Verify the correctness of this test method.");
}
,并在我的程序集信息文件:
[assembly: InternalsVisibleTo("MyProject.Test")]
那么,为什么Visual Studio中的列表的类型设置为Class1_Accessor.myClass
因为myClass
是已知到我的测试项目?
因此,我得到一个运行时错误(无法将类型myClass
转换为类型Class1_Accessor.myClass
)。
由于myFunction是私有的,VisualStudio中生成以下代码(这是适用于大多数的话)
[Shadowing("MyProject.Class1")]
public class Class1_Accessor : BaseShadow
{
protected static PrivateType m_privateType;
[Shadowing("[email protected]")]
public Class1_Accessor();
public Class1_Accessor(PrivateObject value);
public static PrivateType ShadowedType { get; }
public static Class1_Accessor AttachShadow(object value);
[Shadowing("[email protected]")]
public List<Class1_Accessor.myClass> myFunction();
[Shadowing("MyProject.Class1+myClass")]
public class myClass : BaseShadow
{
protected static PrivateType m_privateType;
[Shadowing("[email protected]")]
public myClass();
public myClass(PrivateObject value);
[Shadowing("MyProperty")]
public int MyProperty { get; set; }
public static PrivateType ShadowedType { get; }
public static Class1_Accessor.myClass AttachShadow(object value);
}
}
不过,我不明白为什么它包含MyClass的一个新的定义,因为它是一个内部类,它不应该需要任何访问器。我认为这是问题的根源。
您可能想要添加'mstest'标签来吸引那些使用Accessors的人的注意力。我不确定要删除哪个标签,所以我没有自己编辑标签。我从来没有太在意访问者,所以我没有什么经验。 (此外,有一种强烈的观点认为,你不应该测试私人成员;如果你有一个私人成员不是通过公共成员间接测试的,那么这是一个迹象表明你应该为该逻辑提取一个单独的类。) – phoog 2012-02-21 14:46:45
谢谢,我已经添加了标签。测试私人成员是否是一个完全不同的主题(尽管你是对的)。尽管如此,我仍然想测试一个函数。 – Sam 2012-02-21 14:55:30
关于私人成员的测试,这是一个完全不同的话题是我把它放在括号中的原因。当然,这样的指导方针总是有明确的例外。我会补充说,当我*测试私人成员时,我通常只使用反射 - 我甚至为此目的有一些帮助方法(例如'CallNonPublicMethod(string methodName)')。我发现比访问者更容易处理 - 当我修改它们所映射的类时,我从未想出如何让它们重新生成。 – phoog 2012-02-21 15:04:17