如何在没有 Rubberduck TestModules 的情况下交付 Excel VBA 应用程序?
How can I deliver an Excel VBA app without Rubberduck TestModules?
我一直在使用 Rubberduck VBA 插件。
我想 "deliver" 我的 Excel 应用程序没有参考中的 Rubberduck 插件。你是如何管理的?例如,是否可以 "hide" 测试模块而不编译它们?
如果您的测试模块是早期绑定的(这在开发时是个好主意!),那么您应该在交付之前删除对 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
.
一个相对较新的可能配置是 "dual binding",它按如下方式设置新的测试模块:
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 测试模块切换 late/early 绑定。您可以在 Project Properties 中执行此操作(从“工具”菜单,或在 Code Explorer 和 select 中右键单击您的项目项目属性):
(旁注:帮助文件项目属性(没有人使用它,对吧?)被 Rubberduck 劫持以分配和为项目保留一个唯一的 ID - 在不立即保存和关闭的情况下更改此值 will break stuff)
我一直在使用 Rubberduck VBA 插件。
我想 "deliver" 我的 Excel 应用程序没有参考中的 Rubberduck 插件。你是如何管理的?例如,是否可以 "hide" 测试模块而不编译它们?
如果您的测试模块是早期绑定的(这在开发时是个好主意!),那么您应该在交付之前删除对 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
.
一个相对较新的可能配置是 "dual binding",它按如下方式设置新的测试模块:
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 测试模块切换 late/early 绑定。您可以在 Project Properties 中执行此操作(从“工具”菜单,或在 Code Explorer 和 select 中右键单击您的项目项目属性):
(旁注:帮助文件项目属性(没有人使用它,对吧?)被 Rubberduck 劫持以分配和为项目保留一个唯一的 ID - 在不立即保存和关闭的情况下更改此值 will break stuff)