嘲笑com Interop接口时,缺失的meThodexception,无效的exception



我正在尝试单位测试一个类,该类从com Interop库中依赖接口的依赖性。

正在测试的方法:

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.iautpreferences [myProject] qbxmlrp2lib.irequestprocessor5 :: get_authpreferences()'castle.proxies.proxies.irequestprocessor5proxy'。

因此,递归模拟似乎不起作用。同样,即使在Loose模式下进行模拟,除非提供Setup(),否则MissingMethodException也会抛弃。

发生了什么事,我该如何解决?

要解决此问题,在解决方案资源管理器中选择"单元测试项目"中的com Interop参考。在属性中,将Embed Interop Types更改为false。MOQ现在将按照COM接口的预期行为。

我实际上并不完全理解这里发生了什么。在深魔法(com Interop)和深魔法(MOQ的表达方式和魔法核心)的交集中,怪异而怪异的行为是正常的。但是,我已经确认修复程序确实有效。

最新更新