C# MissingMethodException,模拟COM互操作接口时的InvalidOperationException

C# MissingMethodException,模拟COM互操作接口时的InvalidOperationException,c#,unit-testing,moq,com-interop,C#,Unit Testing,Moq,Com Interop,我试图对一个类进行单元测试,该类从COM互操作库中获取接口的依赖项 试验方法: public void ConfigureAuth(IRequestProcessor5 processor) { processor.AuthPreferences.PutIsReadOnly(false); // more configuration statements... } 我真的想在这里使用递归模拟,因为我无法控制COM代码的形状。我的第一次尝试: [Fact] public void

我试图对一个类进行单元测试,该类从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));
}
[事实]
public void ConfigureAuth_setReadOnlyToFalse()
{
var mockProcessor=newmock{DefaultValue=DefaultValue.Mock};
_testSubject.ConfigureAuth(mockProcessor.Object);
mockProcessor.Verify(p=>p.AuthPreferences.putiStreamOnly(false));
}
这会引发以下异常(来自测试中的验证调用):

System.InvalidOperationException异常 从作用域“”引用了类型为“QBXMLRP2Lib.RequestProcessor3”的变量“p”,但未定义该变量

我最初的假设是递归模拟正在工作,但在
Verify
表达式中发生了一些奇怪的事情,因此我尝试注释
Verify
来测试该假设。然后抛出以下异常(来自测试中的方法):

System.MissingMethodException 错误:类“Castle.Proxies.IRequestProcessor5Proxy”中缺少方法“实例类QBXMLRP2Lib.IAuthPreferences[MyProject]QBXMLRP2Lib.IRequestProcessor5::get_AuthPreferences()”

因此,递归模拟似乎不起作用。此外,即使mock处于
Loose
模式,也会抛出
MissingMethodException
,除非提供
Setup()


发生了什么以及如何修复此问题?

要修复此问题,请在解决方案资源管理器中从单元测试项目中选择COM互操作引用。在属性中,将
嵌入互操作类型
更改为False。Moq现在将按照COM接口的预期运行

我不太明白这里到底发生了什么。在Deep Magic(COM互操作)和Deep Magic(Moq的表达式和DynamicProxies核心)的交叉点上,怪异和古怪的行为是很正常的。但是,我已确认修复程序确实有效。

嵌入互操作类型”功能仅嵌入程序实际使用的类型和接口方法(!)。这不一定与试图覆盖所有方法的mock兼容。