我正在尝试单位测试一个类,该类从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的表达方式和魔法核心)的交集中,怪异而怪异的行为是正常的。但是,我已经确认修复程序确实有效。