Wir haben versucht, Einheitentests für eine in C# geschriebenen Worker-Klasse zu schreiben, die eine API von Drittanbietern (COM-basiert) mit Moq zum dynamischen Erstellen der Mock-Objekte spottet. NUnit ist unser Unit-Testing-Framework.Mocking 3rd Party Callback-Ereignisse mit moq
Diese Komponente von Drittanbietern implementiert einige Schnittstellen, muss aber auch mithilfe von Ereignissen in unsere Worker-Klasse zurückrufen. Unser Plan war, die Ereignisse zu simulieren, die diese 3rd-Party-Komponente auslösen kann, und zu testen, ob unsere Arbeiterklasse wie erwartet funktioniert.
Leider sind wir auf ein Problem gestoßen, bei dem moq anscheinend nicht in der Lage ist, extern definierte Ereignisse auszulösen und anzuheben. Leider kann ich den Code für die genaue API von Drittanbietern, die wir verwenden, nicht angeben, aber wir haben das Problem mit der MS Word-API neu erstellt und gezeigt, wie die Tests funktionieren, wenn eine lokal definierte Schnittstelle verwendet wird:
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);
}
}
}
Könnte jemand erklären, warum das Aufrufen von Ereignissen für die lokal definierte Schnittstelle funktioniert, aber nicht das von der API der dritten Partei (in diesem Fall Word) importierte?
Ich habe das Gefühl, dass dies mit der Tatsache zu tun hat, dass wir mit einem COM-Objekt (über die Interop-Assembly) sprechen, aber nicht sicher sind, wie das Problem zu umgehen ist.
Es scheint, dass dieser Fehler in Moq v4.0 behoben wurde: http://code.google.com/p/moq/issues/detail?id=226 –