MissingMethodException, InvalidOperationException при имитации интерфейса COM-взаимодействия - PullRequest
0 голосов
/ 21 декабря 2018

Я пытаюсь выполнить модульное тестирование класса, который получает зависимость интерфейса от библиотеки взаимодействия COM.

Тестируемый метод:

public void ConfigureAuth(IRequestProcessor5 processor)
{
    processor.AuthPreferences.PutIsReadOnly(false);
    // more configuration statements...
}

Я действительно хочу использовать здесь рекурсивные макеты, поскольку я не контролирую форму кода COM.Моя первая попытка:

[Fact]
public void ConfigureAuth_SetsReadOnlyToFalse()
{
    var mockProcessor = new Mock<IRequestProcessor5>{DefaultValue = DefaultValue.Mock};
    _testSubject.ConfigureAuth(mockProcessor.Object);
    mockProcessor.Verify(p => p.AuthPreferences.PutIsReadOnly(false));
}

При этом выдается следующее исключение (из вызова проверки в тесте):

System.InvalidOperationException переменная 'p' типа 'QBXMLRP2Lib.RequestProcessor3'ссылка из области видимости' ', но она не определена.

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

System.MissingMethodException Ошибка: отсутствует экземпляр класса метода QBXMLRP2Lib.IAuthPreferences [MyProject] QBXMLRP2Lib.IRequestProcessor5 :: get_AuthPreferences () из класса'Castle.Proxies.IRequestProcessor5Proxy'.

Таким образом, рекурсивная насмешка, по-видимому, не работает.Кроме того, даже при использовании макетов в режиме Loose, MissingMethodException выбрасывается, если не указано Setup().

Что происходит и как я могу это исправить?

1 Ответ

0 голосов
/ 21 декабря 2018

Чтобы исправить это, в Solution Explorer выберите ссылку COM-взаимодействия из проекта модульных тестов.В Свойствах измените Embed Interop Types на Ложь.Moq теперь будет вести себя как ожидается для COM-интерфейсов.

На самом деле я не совсем понимаю, что происходит здесь.Странное и эксцентричное поведение является нормой на пересечении Deep Magic (COM Interop) и Deep Magic (ядро Expressions-and-DynamicProxies в Moq).Тем не менее, я подтвердил, что исправление работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...