C# 使用InternalsVisibleToAttribute进行单元测试需要使用/out进行编译:filename.ext?
在我最近的一个问题中,我问的是关于内部可视属性的问题 我已经阅读了关于如何使用它的文档,一切都很好,并且都能理解。然而,我不能从我的测试项目中实例化我的类Groupe 我希望能够从测试程序集中实例化包装程序集中的内部类 感谢您的帮助 编辑#1 下面是我在尝试实例化我的类型时遇到的编译时错误: Erreur 2'Carra.examples.Blocs.ActiveDirectory.grope'n'est pas accessible dans ce contexte,car il est'Private'。C:\Open\Projects\examples\Src\Carra.examples.Blocs.ActiveDirectory\Carra.examples.Blocs.ActiveDirectory.Tests\GroupeTests.vb 9 18 Carra.examples.Blocs.ActiveDirectory.Tests (这说明我的类型在此上下文中是不可访问的,因为它是私有的。)但它是Friend(内部的) 编辑#2 下面是一段建议用于实现公共接口IGroupe的Groupe类的代码:C# 使用InternalsVisibleToAttribute进行单元测试需要使用/out进行编译:filename.ext?,c#,vb.net,unit-testing,.net-2.0,internals,C#,Vb.net,Unit Testing,.net 2.0,Internals,在我最近的一个问题中,我问的是关于内部可视属性的问题 我已经阅读了关于如何使用它的文档,一切都很好,并且都能理解。然而,我不能从我的测试项目中实例化我的类Groupe 我希望能够从测试程序集中实例化包装程序集中的内部类 感谢您的帮助 编辑#1 下面是我在尝试实例化我的类型时遇到的编译时错误: Erreur 2'Carra.examples.Blocs.ActiveDirectory.grope'n'est pas accessible dans ce contexte,car il est'Pr
#Region "Importations"
Imports System.DirectoryServices
Imports System.Runtime.CompilerServices
#End Region
<Assembly: InternalsVisibleTo("Carra.Exemples.Blocs.ActiveDirectory.Tests")>
Friend Class Groupe
Implements IGroupe
#Region "Membres privés"
Private _classe As String = "group"
Private _domaine As String
Private _membres As CustomSet(Of IUtilisateur)
Private _groupeNatif As DirectoryEntry
#End Region
#Region "Constructeurs"
Friend Sub New()
_membres = New CustomSet(Of IUtilisateur)()
_groupeNatif = New DirectoryEntry()
End Sub
Friend Sub New(ByVal domaine As String)
If (String.IsNullOrEmpty(domaine)) Then Throw New ArgumentNullException()
_domaine = domaine
_membres = New CustomSet(Of IUtilisateur)()
_groupeNatif = New DirectoryEntry(domaine)
End Sub
Friend Sub New(ByVal groupeNatif As DirectoryEntry)
_groupeNatif = groupeNatif
_domaine = _groupeNatif.Path
_membres = New CustomSet(Of IUtilisateur)()
End Sub
#End Region
#地区“进口”
导入System.DirectoryServices
导入System.Runtime.CompilerServices
#末端区域
友类群
实现iGroup
#“私人成员”地区
Private\u classe As String=“group”
私有域作为字符串
私有成员作为定制集(IUtilisateur的)
Private\u groupeNatif作为DirectoryEntry
#末端区域
#区域“建设者”
新朋友
_membres=新的(IUtilisateur的)客户集()
_groupeNatif=新目录条目()
端接头
Friend Sub New(ByVal domaine作为字符串)
如果是(String.IsNullOrEmpty(domaine)),则抛出新的ArgumentNullException()
_庄园
_membres=新的(IUtilisateur的)客户集()
_groupeNatif=新目录条目(域)
端接头
Friend Sub New(ByVal groupeNatif作为DirectoryEntry)
_groupeNatif=groupeNatif
_域=_groupeNatif.Path
_membres=新的(IUtilisateur的)客户集()
端接头
#末端区域
以及试图使用它的代码:
#Region "Importations"
Imports NUnit.Framework
Imports Carra.Exemples.Blocs.ActiveDirectory
#End Region
<TestFixture()> _
Public Class GroupeTests
<Test()> _
Public Sub CreerDefaut()
Dim g As Groupe = New Groupe()
Assert.IsNotNull(g)
Assert.IsInstanceOf(Groupe, g)
End Sub
End Class
#地区“进口”
导入NUnit.Framework
导入Carra.examples.Blocs.ActiveDirectory
#末端区域
_
公共类分组测试
_
公共次级信托基金()
尺寸g作为组E=新组E()
Assert.IsNotNull(g)
Assert.IsInstanceOf(组E,g)
端接头
末级
编辑#3
该死!我刚刚注意到我没有在导入区域导入程序集
没有,没有解决任何问题=(
谢谢!它应该已经可以工作了。InternalsVisibleTo使程序集的所有内部成员可见,包括内部类型 当您尝试从测试项目实例化类时会发生什么 编辑:构造函数本身是朋友/内部的吗?您不仅需要访问类型,还需要访问构造函数。诚然,编译器错误似乎不是这个问题,但我不确定 其他需要检查的事项:
是否为您在这对程序集中的其他内部成员工作?可能是因为您没有正确应用InternalsVisibleTo
InternalsVisibleTo
是私有类型中的嵌套类型吗?这可以解释问题Groupe
如果这些都没有帮助,那么如果您可以发布一个非常简短但完整的失败示例就好了—只需在一个程序集中键入一个好友(以及InternalsVisibleTo属性)和另一段尝试使用它的代码。您的测试程序集名为
Carra.examples.Blocs.ActiveDirectory.Tests
您已经导入了
Carra.examples.Blocs.ActiveDirectory.Tests
,但您肯定应该只导入Carra.examples.Blocs.ActiveDirectory
?您的类调用的程序集是什么?看起来有点可疑。在研究和研究之后,仍然在研究和猜测什么?再次研究在中,我发现了一个链接,其中说“InternalsVisibleTo”不适用于VB.NET,但该属性在.NET 2.0中可用。下面是有问题的链接:
备注说明:
在.NET Framework 2.0版中,Visual Basic不支持使用此属性
所以它不可用,仅此而已!=)无错误。我的类型无法在IntelliSense中实例化。您的测试项目是否引用包含要实例化的类型的项目?即使没有internalsVisibleTo,您也应该在intellisense中看到这些类型,如果您尝试使用它们,我认为会出现一个错误。是的,它在同一个解决方案中,并在“添加引用”对话框中作为项目引用。如果您键入类的名称并尝试编译,会出现什么错误?我发布的错误:Erreur 2[…].我发布了当我尝试实例化我的类型时遇到的编译错误。我要对程序集签名吗?(我希望避免…)威尔:这两个大会中有谁签字了?如果他们中的任何一个都是,他们两个都必须是。还有其他想法吗?我迷路了,我不知道在哪里搜索,因为这是我第一次使用InternalsVisibleToAttribute。谢谢!=)@威尔:正如山姆所问的,大会的名字肯定正确吗?请注意,程序集名称和命名空间可以完全不同。您的测试程序集有哪些文件?是的。很好的一点,就像在VBNET中一样,名称空间没有写在类文件中,这是我不喜欢的。我本来会这么想的,但它似乎没有改变任何东西=(威尔,那些导入看起来不正确。我已经更新了我的答案。谢谢你的评论,山姆!这是一个错误的复制和粘贴,因为导入在我的原始代码中声明了正确的程序集。我已经阅读了关于在命令行中使用/out:filen编译的内容