如何在没有Rubberduck TestModules的情况下交付Excel VBA应用程序?

我一直在使用Rubberduck VBA加载项。

我要“提供”我的Excel应用程序,而没有“参考”中的Rubberduck加载项。您如何处理?例如,是否可以“隐藏” TestModules而不编译它们?

ttmax_1 回答:如何在没有Rubberduck TestModules的情况下交付Excel VBA应用程序?

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

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

可以按原样发送项目(带有测试模块,但没有对Rubberduck的引用),因为测试模块不会在实际实时代码的任何执行路径中执行:该项目不会编译,但它仍然可以正常运行(除非有人尝试调用测试方法..然后将加载测试模块,并且编译器会注意到缺少的库)。

但是我的建议是更进一步,晚绑定AssertClass实例(如果使用的是API,则绑定FakesProvider

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配置为默认情况下后期绑定新测试模块:

Unit Test Settings

如果您使用“ 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 中执行此操作(从“工具”菜单中,或在 Code Explorer 中右键单击您的项目,然后选择 Project Properties )。 :

Project Properties VBIDE dialog

(附注:帮助文件项目属性(没有人使用它,对吗?)正在被Rubberduck劫持,以为该项目分配并保留唯一的ID-更改此值而不立即保存并关闭将会破坏东西)

本文链接:https://www.f2er.com/3136576.html

大家都在问