Ответ 1
Отказ от ответственности. У меня есть репозиторий Rubberduck GitHub, и я один из разработчиков, участвующих в проекте.
Rubberduck находится в активной разработке. Это много больше, чем инструмент для тестирования модулей для VBA, но он работает очень хорошо и позволяет писать тесты модуля VBA практически без шаблона:
'@TestModule
Private Assert As New Rubberduck.AssertClass
'@TestMethod
Public Sub TestMethod1()
Assert.Inconclusive "Test method is not written yet."
End Sub
'@TestMethod
Public Sub AnotherTestMethod()
Assert.IsTrue False, "Something wrong?"
End Sub
И затем вы сможете перемещаться и запускать свои тестовые методы в стыковочном окне, которое также дает вам меню для быстрого добавления меток метода arr-act-assert, а AssertClass
также может быть слишком поздним, поэтому вы не не нужно беспокоиться о развертывании Rubberduck в любом месте, кроме вашей среды разработки, только чтобы компилировать код.
Страница unit testing wiki в репозитории Rubberduck GitHub объясняет почти все, что можно объяснить об использовании.
В последних версиях версии 2.1 есть начало "фальшивых" фреймов, которые могут использоваться для захвата ряда стандартных вызовов библиотеки, которые обычно мешают единичным тестам, буквально превращая стандартную библиотеку в "тестовые подделки", которые могут быть настроены так, как указано при выполнении в контексте Rubberduck unit test, например MsgBox
:
'@TestMethod
Public Sub TestMethod1()
On Error GoTo TestFail
Fakes.MsgBox.Returns 42 ' MsgBox function will return 42
'here you'd invoke the procedure you want to test
Debug.Print MsgBox("This MsgBox isn't going to pop up!", vbOkOnly, "Rubberduck") 'prints 42
With Fakes.MsgBox.Verify ' Test will pass if MsgBox was invoked as specified
.Parameter "prompt", "This MsgBox isn't going to pop up!"
.Parameter "buttons", vbOkOnly
.Parameter "title", "Rubberduck"
End With
TestExit:
Exit Sub
TestFail:
Assert.Fail "Test raised an error: #" & Err.Number & " - " & Err.Description
End Sub
Взносы на расширение API Fakes
для покрытия большего числа функций более чем приветствуются. Особенно полезно было бы использовать ссылки FileSystemObject
.