Как я могу доставить приложение Excel VBA без Testduck TestModules? - PullRequest
5 голосов
/ 08 ноября 2019

Я использую надстройку Rubberduck VBA.

Я хочу "доставить" свое приложение Excel без надстройки Rubberduck в списке литературы. Как тебе это удается? Можно ли, например, «спрятать» тестовые модули и не скомпилировать их?

1 Ответ

6 голосов
/ 08 ноября 2019

Если ваши тестовые модули были ранними (что является отличной идеей при разработке!), То перед доставкой вам следует удалить ссылку на библиотеку типов Rubberduck.

Конечно, вы можете просто удалить тестмодули, но это становится раздражением от повторного импорта и экспорта ... и вы не хотите этого делать.

Вы можете отправить проект как есть (с тестовыми модулями, но без ссылки на Rubberduck), потому что тестовые модули не будут находиться в каком-либо пути выполнения для реального живого кода: проект не будет compile , но он все равно будет работать нормально (если кто-то не попытается вызвать тестовый метод ... тогда будет загружен тестовый модуль (модули), и отсутствующая библиотека будет замечена компилятором).

Но я бы порекомендовал сделать еще один шаг и позднее привязать экземпляр AssertClassFakesProvider, если вы используете этот 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 на более поздний срок. -привязать новые тестовые модули по умолчанию:

Unit Test Settings

Если вы используете «Permissive assert» (он реализует равенство типов в VBA-подобном разрешающем способе), ProgID you 'Я хочу использовать для позднего связывания 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 одновременно. Вы можете сделать это в Свойства проекта (из меню Сервис или щелкнуть правой кнопкой мыши свой проект в Code Explorer и выбрать Свойства проекта ):

Project Properties VBIDE dialog

(примечание: свойство проекта Файл справки (никто не использует это, верно?) Перехватывается Rubberduck для присвоения и сохраненияуникальный идентификатор проекта - изменение этого значения без немедленного сохранения и закрытия будет сломать материал)

...