代码之家  ›  专栏  ›  技术社区  ›  Will Marcouiller

当InternalsVisibleToAttribute不是选项时,如何使用反射对程序集中的内部(VB中的Friend)类进行单元测试?

  •  1
  • Will Marcouiller  · 技术社区  · 15 年前

    我有两个项目的解决方案:

    Company.Project.vbproj
    Company.Project.Tests.vbproj
    

    Company.Project.vbproj 大会,我有课 FriendClass.vb Friend (internal in C#)

    友情类.vb 从内部 Company.Project.Tests.vbproj InternalsVisibleToAttribute ,但这在Visual Basic.NET 2.0中不是一个选项,因为它仅适用于.NET 2.0中的C#( see here ).

    我想自己创建一个代理类使用这个内部 友谊班 在我的测试程序集中,这样我就可以实例化它并相应地进行测试。

    有没有这样做的想法或已知的做法?

    1 回复  |  直到 9 年前
        1
  •  1
  •   Will Marcouiller    15 年前

    我发现的唯一解决方法是.NETFramework1.1中使用的方法。

    作为 InternalsVisibleToAttribute 在.NET2.0VisualBasic中不可用,我发现的唯一解决方法是将测试包含在与库本身相同的项目中。此外,还有一些工作要做。

    1. 为自己创建一个名为“Tests”的新编译配置(在这里可以选择“Release”/“Debug”);
    2. 添加一个新类,测试你的朋友(C#内部)成员;
    3. 此类中的第一行代码应为: #if CONFIG = "Tests" then ... #end if
    4. 将代码放在此编译器IF指令之间。

    例如,如果我有以下Friend类:

    Friend Class MyFactory
        Friend Property Property1 As Object
            Get
                Return _field1
            End Get
            Set (ByVal value As Object)
                _field1 = value
            End Set
        End Property
    
        Friend Sub SomeSub(ByVal param1 As Object)
            ' Processing here...
        End Sub
    End Class
    

    然后,如果您想在.NET2.0VisualBasic中测试这个类,您需要在同一个项目中创建一个测试类,其中 MyFactory 上课坐着。这个类应该是这样的:

    #If CONFIG = "Tests" Then
    
        Imports NUnit.Framework
    
        <TestFixture()> _
        Public Class MyFactoryTests
            <Test()> _
            Public Sub SettingProperty1Test
                ' Doing test here...
            End Sub
        End Class
    
    #End If
    

    因为有一个编译器指令告诉编译器只有在选择了“Tests”配置时才编译并包含这个类,所以在“Debug”或“Release”模式下不会得到这个类。这个类甚至不会成为库的一部分,这是因为它不会不必要地污染你的库,而且它允许你测试你的朋友类。

    这是我在visualbasic.net2.0中找到的解决这个问题的最聪明的方法。