首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >InternalsVisibleTo似乎被忽视了

InternalsVisibleTo似乎被忽视了
EN

Stack Overflow用户
提问于 2012-02-21 14:24:43
回答 2查看 2K关注 0票数 5

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

我使用了程序集属性InternalsVisibleTo,这样我的测试项目就知道了myClass类型。

下面是我想测试的代码:

代码语言:javascript
复制
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.");
}

在我的汇编信息文件中:

代码语言:javascript
复制
[assembly: InternalsVisibleTo("MyProject.Test")]

那么,为什么Visual将列表的类型设置为Class1_Accessor.myClass,因为我的测试项目知道myClass

因此,我得到一个运行时错误(不能将myClass类型转换为Class1_Accessor.myClass类型)。

因为myFunction是私有的,所以VisualStudio生成以下代码(这对大多数代码都很好)

代码语言:javascript
复制
[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的新定义,因为它是一个内部类,不需要任何访问器。在我看来,这就是问题的根源。

EN

回答 2

Stack Overflow用户

发布于 2012-02-21 14:33:35

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

说出我们需要知道的一切:简单地说,你对myClass有两个不同的定义。类型由程序集限定范围;[InternalsVisibleTo(...)]使其可访问,但除此之外:业务如常。

找到为什么/哪里有第二个myClass,其中一个是:

  • 消歧(命名空间-限定等)
  • 把其中一个改名
  • 如果它们的意思是相同的,并且不正确地复制,就移除其中的一个。

这与拥有:

代码语言:javascript
复制
namespace A { class Foo {} }
namespace B { class Foo {} }

这是两个完全不相关的类,称为Foo,它们之间的转换将失败。

票数 4
EN

Stack Overflow用户

发布于 2012-02-21 14:30:59

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

更新

尝试如下(根据此文档):重新生成您的测试类,在“创建单元测试”对话框中,单击“设置”。在“测试生成设置”中,确保选中了“荣誉InternalsVisibleTo属性”复选框

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9379207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档