8

我一直在使用 Rubberduck VBA 插件。

我想“交付”我的 Excel 应用程序,而不在参考资料中使用 Rubberduck 插件。你是怎么管理的?例如,是否可以“隐藏”TestModules 而不编译它们?

4

1 回答 1

8

如果您的测试模块是早期绑定的(这在开发时是个好主意!),那么您应该在交付之前删除对 Rubberduck 类型库的引用。

当然,您可以简单地删除测试模块,但这会成为重新导入和导出的烦恼......而且您不想这样做。

可以按原样交付项目(使用测试模块,但引用 Rubberduck),因为测试模块不会位于实际实时代码的任何执行路径中:项目不会编译,但会仍然运行良好(除非有人尝试调用测试方法..然后将加载测试模块,并且编译器会注意到缺少的库)。

但我的建议是更进一步并后期绑定AssertClass实例(FakesProvider如果您使用的是该 API,则为 ):

Option Explicit
Option Private Module

'@TestModule
'@Folder("Tests")

Private Assert As Object
Private Fakes As Object

'@ModuleInitialize
Private Sub ModuleInitialize()
    'this method runs once per module.
    Set Assert = CreateObject("Rubberduck.AssertClass")
    Set Fakes = CreateObject("Rubberduck.FakesProvider")
End Sub

'@ModuleCleanup
Private Sub ModuleCleanup()
    'this method runs once per module.
    Set Assert = Nothing
    Set Fakes = Nothing
End Sub

随着测试的后期绑定,项目现在将使用包含的测试模块进行编译。当然,调用测试方法会失败(除非 Rubberduck 在那台机器上!),但是测试模块不应该在 VBA 项目的任何执行路径中。

默认情况下,您可以配置 Rubberduck 以后期绑定新的测试模块:

单元测试设置

如果您使用“Permissive assert”(它以类似 VBA 的许可方式实现类型相等),您要用于后期绑定的 ProgID 是Rubberduck.PermissiveAssertClass.

一个相对较新的可能配置是“双重绑定”,它设置新的测试模块如下:

Option Explicit
Option Private Module

'@TestModule
'@Folder("Tests")

#Const LateBind = LateBindTests

#If LateBind Then
    Private Assert As Object
    Private Fakes As Object
#Else
    Private Assert As Rubberduck.PermissiveAssertClass
    Private Fakes As Rubberduck.FakesProvider
#End If

'@ModuleInitialize
Private Sub ModuleInitialize()
    'this method runs once per module.
    #If LateBind Then
        Set Assert = CreateObject("Rubberduck.PermissiveAssertClass")
        Set Fakes = CreateObject("Rubberduck.FakesProvider")
    #Else
        Set Assert = New Rubberduck.PermissiveAssertClass
        Set Fakes = New Rubberduck.FakesProvider
    #End If
End Sub

'@ModuleCleanup
Private Sub ModuleCleanup()
    'this method runs once per module.
    Set Assert = Nothing
    Set Fakes = Nothing
End Sub

像这样配置,您可以轻松地在后期和早期绑定模式之间切换:

#Const LateBind = True '/False

如果您有多个测试模块,您可以定义一个名为 的项目级预编译器常量LateBindTests,并同时切换所有 Rubberduck 测试模块的后期/早期绑定。您可以在Project Properties中执行此操作(从 Tools 菜单,或在Code Explorer中右键单击您的项目并选择Project Properties):

项目属性 VBIDE 对话框

(旁注:帮助文件项目属性(没有人使用它,对吗?)被 Rubberduck 劫持,为项目分配和保留一个唯一 ID - 在不立即保存和关闭的情况下更改此值破坏东西)

于 2019-11-08T16:26:21.407 回答