Verspotten von Callback-Ereignissen von Drittanbietern mit moq

Wir haben versucht, Unit-Tests für eine in C # geschriebene Worker-Klasse zu schreiben, die eine Drittanbieter-API (COM-basiert) mit moq zum dynamischen Erstellen der Mock-Objekte verspottet. NUnit ist unser Unit-Testing-Framework.

Diese Komponente eines Drittanbieters implementiert einige Schnittstellen, muss aber auch mithilfe von Ereignissen in unsere Arbeiterklasse zurückgerufen werden. Unser Plan war es, die Ereignisse zu simulieren, die diese Komponente von Drittanbietern auslösen kann, und zu testen, ob unsere Arbeiterklasse wie erwartet funktioniert.

Leider sind wir auf ein Problem gestoßen, bei dem es moq anscheinend nicht möglich ist, extern definierte Ereignisse auszusprechen und auszulösen. Leider kann ich nicht den Code für die exakte Drittanbieter-API bereitstellen, die wir verwenden, aber wir haben das Problem mithilfe der MS Word-API neu erstellt und auch gezeigt, wie die Tests bei Verwendung einer lokal definierten Schnittstelle funktionieren:

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);
        }
    }
}

Kann jemand erklären, warum das Auslösen von Ereignissen für die lokal definierte Schnittstelle funktioniert, nicht jedoch für die von der Drittanbieter-API (in diesem Fall Word) importierte?

Ich habe das Gefühl, dass dies damit zusammenhängt, dass wir mit einem COM-Objekt (über die Interop-Assembly) sprechen, aber nicht sicher sind, wie das Problem umgangen werden soll.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage