Hemos estado intentando pruebas de unidad de escritura para una clase de trabajador escrita en C#, que burla una API de terceros (basada en COM) utilizando moq para crear dinámicamente los objetos simulados. NUnit es nuestro marco de pruebas unitarias.Mocking eventos de devolución de llamada de terceros usando moq
Este componente de terceros implementa un par de interfaces, pero también necesita volver a llamar a nuestra clase de trabajadores utilizando eventos. Nuestro plan fue simular los eventos que puede generar este componente de terceros y probar que nuestra clase de trabajadores funcionó como se esperaba.
Desafortunadamente nos hemos encontrado con un problema en el que moq parece incapaz de simular y generar eventos que están definidos externamente. Desafortunadamente no puedo proporcionar el código para la API de terceros exacta que estamos utilizando, pero hemos recreado el problema utilizando la API de MS Word y también se muestra cómo funcionan las pruebas cuando se utiliza una interfaz definida localmente:
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);
}
}
}
¿Alguien podría explicar por qué funciona la generación de eventos para la interfaz definida localmente pero no la importada de la API de terceros (en este caso, Word)?
Tengo la sensación de que esto tiene que ver con el hecho de que estamos hablando con un objeto COM (a través del conjunto de interoperabilidad) pero no estoy seguro de cómo solucionar el problema.
Parece que este error se ha corregido en Moq v4.0: http://code.google.com/p/moq/issues/detail?id=226 –