InternalsVisibleTo似乎被忽略了

Sam*_*Sam 5 unit-testing mstest private internal visual-studio

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

我已经使用了assembly属性InternalsVisibleTo,因此myClass我的Test项目已知该类型.

这是我要测试的代码:

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.");
}
Run Code Online (Sandbox Code Playgroud)

并在我的程序集信息文件中:

[assembly: InternalsVisibleTo("MyProject.Test")]
Run Code Online (Sandbox Code Playgroud)

那么为什么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);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,我不明白为什么它包含myClass的新定义,因为它是一个内部类,它不需要任何访问器.在我看来,这是问题的根源.

Fer*_*ndo 0

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

更新

尝试一下(按照此文档):重新生成测试类,在“创建单元测试”对话框中,单击“设置”。在测试生成设置中,确保选中 Honor InternalsVisibleTo Attribute 复选框