Пересмешивание сторонних событий обратного вызова с использованием moq

Мы'мы пытались написать модульные тесты для рабочего класса, написанного на C #, который макетирует сторонний API (на основе COM), используя moq для динамического создания фиктивных объектов. NUnit является нашей структурой модульного тестирования.

Этот сторонний компонент реализует несколько интерфейсов, но также должен вызывать обратный вызов в нашем рабочем классе, используя события. Наш план состоял в том, чтобы смоделировать события, которые может вызывать этот сторонний компонент, и проверить, что наш рабочий класс работал должным образом.

К сожалению мыМы столкнулись с проблемой в том, что 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 mockApp = new Mock();

            // 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 mockApp = new Mock();

            // 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-объектом (через сборку взаимодействия), но я не уверен, как обойти эту проблему.

Ответы на вопрос(2)

Ваш ответ на вопрос