Агрегатор событий Mocking Prism, использующий Moq для модульного тестирования - PullRequest
6 голосов
/ 01 августа 2010

Мне нужен совет о том, как использовать Moq в модульном тесте, чтобы убедиться, что мой тестируемый класс ведет себя так, как я хочу. То есть тестируемый класс публикует событие Event Aggregator (из Prism), и мне нужен какой-то способ утверждать, что это событие было вызвано в моем тесте.

У меня не так много ресурсов на работе, и мне трудно понять, как это настроить.

У меня есть: -

public SomeEvent : CompositePresentationEvent<SomeEvent>
{
   EventPayload
}

public SomeClass
{
     void Allocate(){EventAggregator.Publish<SomeEvent>}
}

public SomeService : IService
{
     SomeService(){ EventAggregator.Subscribe<SomeEvent>(DoSomething)}
     void DoSomething(SomeEvent evt){}
}

Я думаю, что если мой тест предназначен для SomeClass, мне нужно убедиться, что, если я позвоню SomeClass. Распределение сообщения SomeEvent публикуется. Как это сделать?

Нужно ли также проверять, что поддельный SomeService получает SomeEvent? Или это отдельный модульный тест, относящийся к модульному тесту SomeService, а не SomeClass?

В любом случае, не знаете, как все это настроить, поэтому мы будем благодарны за любые советы.

1 Ответ

9 голосов
/ 12 сентября 2010

Вы бы поставили SomeClass IEventAggregator, что позволит вам использовать макет во время тестирования:

public SomeClass(IEventAggregator eventAggregator)
{
     _eventAggregator = eventAggregator;
}

Тогда ваш тест будет выглядеть примерно так:

var fakeEventAggregator = new Mock<IEventAggregator>();
var fakeEvent = new Mock<SomeEvent>();

fakeEventAggregator.
    Setup(x => x.GetEvent<SomeEvent>()).
    Returns(fakeEvent.Object);

var test = new SomeClass(fakeEventAggregator.Object);
test.Allocate();

fakeEvent.Verify(x => x.Publish(It.IsAny<SomeEventArgs>()));

Если это модульные тесты, то вы бы тестировали подписку полностью отдельно в SomeService тестах. Вы проверяете, что SomeClass правильно публикует событие и что SomeService ведет себя правильно, когда ему дается событие для обработки.

...