我们一直在尝试为一个用C#编写的worker类编写单元测试,它使用moq动态创建模拟对象的第三方应用程序接口(基于COM)。NUnit是我们的单元测试框架。
这个第三方组件实现了几个接口,但也需要使用事件回调我们的worker类。我们的计划是模拟这个第三方组件可以引发的事件,并测试我们的worker类是否按预期运行。
不幸的是,我们遇到了一个问题,因为moq似乎无法模拟和引发外部定义的事件。不幸的是,我不能提供我们正在使用的确切第三方API的代码,但我们已经使用MS Word API重新创建了这个问题,并展示了使用本地定义的接口时测试是如何工作的:
using Microsoft.Office.Interop.Word;
using Moq;
using NUnit.Framework;
using SeparateNamespace;
namespace SeparateNamespace
{
public interface LocalInterface_Event
{
event ApplicationEvents4_WindowActivateEventHandler WindowActivate;
}
}
namespace TestInteropInterfaces
{
[TestFixture]
public class Test
{
[Test]
public void InteropExample()
{
// from interop
Mock<ApplicationEvents4_Event> mockApp = new Mock<ApplicationEvents4_Event>();
// identical code from here on...
bool isDelegateCalled = false;
mockApp.Object.WindowActivate += delegate { isDelegateCalled = true; };
mockApp.Raise(x => x.WindowActivate += null, null, null);
Assert.True(isDelegateCalled);
}
[Test]
public void LocalExample()
{
// from local interface
Mock<LocalInterface_Event> mockApp = new Mock<LocalInterface_Event>();
// identical code from here on...
bool isDelegateCalled = false;
mockApp.Object.WindowActivate += delegate { isDelegateCalled = true; };
mockApp.Raise(x => x.WindowActivate += null, null, null);
Assert.True(isDelegateCalled);
}
}
}谁能解释一下为什么为本地定义的接口引发事件有效,而不是从第三方API (在本例中为Word)导入的接口?
我有一种感觉,这是因为我们正在与一个COM对象对话(通过互操作程序集),但不确定如何解决这个问题。
发布于 2010-01-21 03:12:13
您能否从第三方重新定义COM接口,并将其与moq一起使用。
您的意图似乎是为了摆脱外部依赖,而moq并没有很好地处理COMInterop程序集,您应该能够打开反射器并从互操作程序集中提取任何您想要的接口定义,定义模拟并运行您的单元测试
https://stackoverflow.com/questions/2097205
复制相似问题