Как я могу доставить приложение Excel VBA без тестовых модулей Rubberduck?

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

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


person Ben    schedule 08.11.2019    source источник
comment
Мне кажется, все, что вам нужно сделать, это удалить тестовый модуль (модули). Я не думаю, что есть ссылка на RD в Tools›References.   -  person SmileyFtW    schedule 08.11.2019
comment
@SmileyFtW, который будет работать, но в этом нет необходимости (плюс затем он становится PITA для их экспорта / повторного импорта для обслуживания и развертывания)   -  person Mathieu Guindon    schedule 08.11.2019
comment
@MathieuGuindon - Согласитесь, это будет PITA, но если распространяемый код будет обновлен, не будет ли это код в системе разработчика, а не пользователь, а обновленный код не будет зависеть от кода, который был распространен пользователю ? Конечно, тогда пользователь не сможет увидеть замечательные вещи, которые делает RD.... ‹g›   -  person SmileyFtW    schedule 08.11.2019
comment
@SmileyFtW в теории, да .. на практике .... Обслуживание и развертывание VBA не совсем стандартизированы :)   -  person Mathieu Guindon    schedule 08.11.2019
comment
Отличный вопрос. Помечено для дальнейшего использования   -  person FreeMan    schedule 08.11.2019


Ответы (1)


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

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

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

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

Настройки модульного теста

Если вы используете «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 одновременно. Это можно сделать в Свойствах проекта (из меню "Инструменты" или щелкните проект правой кнопкой мыши в Проводнике кода и выберите Свойства проекта). :

Диалог свойств проекта VBIDE

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

person Mathieu Guindon    schedule 08.11.2019
comment
FWIW, если вы хотите иметь глобальный переключатель, потому что у вас есть несколько тестовых модулей, вы можете определить флаг в свойствах проекта (через меню «Отладка»). - person this; 08.11.2019
comment
@MathieuGuindon Отличный ответ! Я знал, что что-то связано с поздним связыванием... Моя ошибка заключалась в том, что я добавил раннее связывание и не удалил ссылки на резиновых уточек... Спасибо! - person Ben; 08.11.2019