Ваша насмешливая структура - проблема здесь. Макет объекта, возвращаемого этим вызовом:
repository.DynamicMock<PersonLib.DatabaseCommand>();
реализует интерфейс класса DatabaseCommand
, но не высмеивает его события. Следовательно, когда вы передаете экземпляр этого фиктивного объекта в код VB6, который ожидает получить объект DatabaseCommand, который может вызывать события, он не будет работать.
Когда вы передаете фиктивный объект методу PersonClass.Init
, вот упрощенная версия происходящего:
Код попадает в эту строку в PersonClass.Init
:
Set dbCommand = vDBCommand
VB6 запрашивает объект справа от оператора Set
, если он поддерживает те же события, что и класс DatabaseCommand
(VB6 делает это, потому что вы объявили dbCommand
с WithEvents
ключевое слово, поэтому он попытается настроить приемник событий для получения событий от объекта dbCommand
.
Объект, который вы передали, однако, являющийся фиктивным объектом, а не реальным DatabaseCommand
объектом, фактически не реализует события, которые реализует реальный класс DatabaseCommand
. Когда VB6 сталкивается с этим, он вызывает ошибку, которую вы видите.
Я не могу придумать, как заставить фиктивный объект поддерживать те же события, что и класс DatabaseCommand
, чтобы заставить ваш тестовый код работать (ну, я могу придумать один способ, но это потребует перестройки вашего классы), но я могу опубликовать более позже, если я найду более разумное решение.