设置 InternalsVisibleTo 属性

更新:2007 年 11 月

您的代码可能包含这样的类、接口或构造:它们具有用 Visual C# 编写的 internal 访问限定符或用 Visual Basic 编写的 Friend 访问限定符。类型具有此限定符的原因有两个:

  • 您已显式将它们标记为内部类型。

  • 默认情况下,没有显式访问限定符的顶级类、接口或结构被视为内部类、接口或结构。

默认情况下,测试代码中的私有、内部和友好元素对测试代码不可见,但您仍然可以测试它们。有关如何测试私有方法的信息,请参见如何:测试私有方法

具有 Internal 访问限定符的测试元素

当您为包含内部类型的代码生成单元测试方法时,可能会看到“添加 InternalsVisibleTo 属性”对话框。该对话框包含下列是否问题:

您已经选择针对标记为 Friend 或 Internal 的类型生成测试。是否要为项目 <项目名称> 添加 InternalsVisibleTo 属性?

如果已经对源项目启用了强名称签名,则需要对测试项目也启用签名。否则,您将会收到一个编译错误。

这此消息中,<项目名称> 指的是包含您的测试代码的项目。如果您回答“是”,将使用 InternalsVisibleTo 属性标记测试代码的程序集,从而使该程序集中的内部类型对您的测试项目可见。这使您可以对这些内部类型执行单元测试。

说明:

InternalsVisibleTo 属性可以采用两种形式。简单形式指定要为其授予访问权限的程序集。复杂形式还包含一个公钥,用于进行强名称签名。有关更多信息,请参见下一节。

如果您回答“否”,测试代码程序集中的内部类型将被视为具有 private 访问限定符。在这种情况下,测试生成过程将创建一个专用访问器,使测试程序集能够访问这些类型(无论是内部的还是私有的)。您将在测试项目的“测试引用”文件夹中看到这个专用访问器。

InternalsVisibleTo 或专用访问器:使用哪一个?

使用专用访问器程序集既可以访问私有成员也可以访问内部成员。如果您的测试代码具有内部成员,但没有私有成员,则最好在您的测试代码中使用 InternalVisibleTo 属性,而不用再创建专用访问器程序集。但如果您的代码同时具有要测试的私有成员和内部成员,请使用专用访问器,因为它提供了对这两种成员的访问。 有关更多信息,请参见使用专用访问器

强名称签名要求

“添加 InternalsVisibleTo 属性”对话框的第二段包含有关强名称签名的信息。它表示如果不正确启用强名称签名,生成解决方案时将产生编译器错误:

  • 如果为您的测试代码程序集启用了强名称签名,还要为测试程序集启用强名称签名。在这种情况下,您必须使用“InternalsVisibleTo”属性的签名形式。例如:

    [InternalsVisibleTo(“OtherAssembly, PublicKey=12435234fsdaf;l457fwi248ew843872r892r”)]

  • 如果没有为您的测试代码程序集启用强名称签名,则不必为测试程序集启用强名称签名。在这种情况下,可以使用“InternalsVisibleTo”属性的未签名形式:

    [InternalsVisibleTo(“OtherAssembly”)]

    说明:

    如果您“添加 InternalsVisibleTo 属性”对话框中单击“是”,Visual Studio 将添加“InternalsVisibleTo”属性的简单形式,即不带公钥的形式。

检测测试代码程序集以启用代码覆盖率数据收集也会影响强名称签名。有关更多信息,请参见对程序集进行检测和重新签名

请参见

任务

如何:测试私有方法

概念

使用专用访问器