InternalsVisibleTo似乎被忽略了

时间:2012-02-21 14:24:44

标签: visual-studio unit-testing mstest private internal

我正在尝试在.net中对私有函数进行单元测试。此私有函数返回类型为myClass的集合,该集合是内部类。

我使用了汇编属性InternalsVisibleTo,因此我的Test项目已知类型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(".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的新定义,因为它是一个内部类,不需要任何访问器。在我看来,这是问题的根源。

2 个答案:

答案 0 :(得分:4)

  

无法将myClass类型转换为类型Class1_Accessor.myClass

说出我们需要知道的一切:简单地说 - 你有两个不同的myClass定义。类型由程序集限定; <{1}}使可访问,但除此之外:照常营业。

查找原因/您在哪里获得第二个[InternalsVisibleTo(...)],以及其中一个:

  • 消除歧义(名称空间限定等)
  • 重命名其中一个
  • 如果它们的含义相同,则删除其中一个,并且错误地重复

这与拥有:

完全相同
myClass

这是两个完全不相关的类namespace A { class Foo {} } namespace B { class Foo {} } ,它们之间的转换会失败。

答案 1 :(得分:0)

InternalsVisibleTo不会使私有成员对朋友程序集可见。它适用于标记为内部的成员/类型。查看文档here

<强>更新

尝试此操作(根据此doc):重新生成测试类,在“创建单元测试”对话框中,单击“设置”。在“测试生成设置”中,确保选中“Honor InternalsVisibleTo属性”复选框