我试图在.net中对一个私有函数进行单元测试。这个私有函数返回一个类型为myClass的集合,它是一个内部类。
我使用了程序集属性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将列表的类型设置为Class1_Accessor.myClass,因为我的测试项目知道myClass?
因此,我得到一个运行时错误(不能将myClass类型转换为Class1_Accessor.myClass类型)。
因为myFunction是私有的,所以VisualStudio生成以下代码(这对大多数代码都很好)
[Shadowing("MyProject.Class1")]
public class Class1_Accessor : BaseShadow
{
protected static PrivateType m_privateType;
[Shadowing(".ctor@0")]
public Class1_Accessor();
public Class1_Accessor(PrivateObject value);
public static PrivateType ShadowedType { get; }
public static Class1_Accessor AttachShadow(object value);
[Shadowing("myFunction@0")]
public List<Class1_Accessor.myClass> myFunction();
[Shadowing("MyProject.Class1+myClass")]
public class myClass : BaseShadow
{
protected static PrivateType m_privateType;
[Shadowing(".ctor@0")]
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的新定义,因为它是一个内部类,不需要任何访问器。在我看来,这就是问题的根源。
发布于 2012-02-21 14:33:35
无法将myClass类型转换为Class1_Accessor.myClass类型
说出我们需要知道的一切:简单地说,你对myClass有两个不同的定义。类型由程序集限定范围;[InternalsVisibleTo(...)]使其可访问,但除此之外:业务如常。
找到为什么/哪里有第二个myClass,其中一个是:
这与拥有:
namespace A { class Foo {} }
namespace B { class Foo {} }这是两个完全不相关的类,称为Foo,它们之间的转换将失败。
发布于 2012-02-21 14:30:59
InternalsVisibleTo不会使私有成员对朋友程序集可见。它适用于标记为内部的成员/类型。检查文档这里。
更新
尝试如下(根据此文档):重新生成您的测试类,在“创建单元测试”对话框中,单击“设置”。在“测试生成设置”中,确保选中了“荣誉InternalsVisibleTo属性”复选框
https://stackoverflow.com/questions/9379207
复制相似问题