我们一直在尝试编写C#的worker类的单元测试,使用moq模仿一个基于COM的第三方API来动态创建模拟对象。我们使用NUnit作为单元测试框架。
这个第三方组件实现了一些接口,但也需要通过事件回调到我们的worker类中。我们的计划是模拟这个第三方组件可能引发的事件,并测试我们的worker类是否按预期操作。
不幸的是,我们遇到了一个问题,moq似乎无法模拟和触发外部定义的事件。不幸的是,我无法提供我们使用的确切第三方API的代码,但我们已经使用MS Word API重新创建了这个问题,并展示了在使用本地定义的接口时测试的工作方式。
这个第三方组件实现了一些接口,但也需要通过事件回调到我们的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对象进行通信有关,但我不确定如何解决这个问题。