Szokowanie zdarzeń wywołania zwrotnego innych firm za pomocą moq

Próbowaliśmy napisać testy jednostkowe dla klasy robotniczej napisanej w języku C #, która wykluczyła API innej firmy (oparte na COM), używając moq do dynamicznego tworzenia obiektów próbnych. NUnit to nasza platforma testów jednostkowych.

Ten komponent innej firmy implementuje kilka interfejsów, ale musi także wywołać naszą klasę robotniczą przy użyciu zdarzeń. Naszym planem było zasymulowanie zdarzeń, które ten trzeci komponent może podnieść, i przetestowanie, że nasza klasa pracowała zgodnie z oczekiwaniami.

Niestety napotkaliśmy problem polegający na tym, że moq wydaje się niezdolny do wyśmiewania i wywoływania zdarzeń, które są zdefiniowane zewnętrznie. Niestety nie mogę podać kodu dla dokładnego interfejsu API używanego przez nas, ale odtworzyliśmy ten problem za pomocą interfejsu API MS Word, a także pokazaliśmy, jak działają testy, gdy korzystamy z lokalnie zdefiniowanego interfejsu:

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

Czy ktokolwiek mógłby wyjaśnić, dlaczego wywoływanie zdarzeń dla lokalnie zdefiniowanego interfejsu działa, ale nie zaimportowane z interfejsu API innej firmy (w tym przypadku Word)?

Mam wrażenie, że ma to związek z faktem, że rozmawiamy z obiektem COM (poprzez zespół interop), ale nie jestem pewien, jak obejść ten problem.

questionAnswers(2)

yourAnswerToTheQuestion