Как я тестирую подписки агрегатора события Prism на UIThread?

У меня есть класс, который подписывается на событие через агрегатор события PRISM.

Поскольку несколько трудно дразнить агрегатор события, как отмечено здесь, я просто инстанцирую реального и передаю его системе под тестом.

В моем тесте я затем публикую событие через тот агрегатор и затем проверяю, как моя система под тестом реагирует на него. Так как событие будет сгенерировано FileSystemWatcher во время производства, я хочу использовать автоматическую отправку путем подписки на UIThread, таким образом, я могу обновить свой UI, после того как событие генерируется.

Проблема, что во время теста, событие никогда не замечается в системе под тестом, если я не подписываюсь на UIThread.

Я использую MSpec для своих тестов, которые я запускаю из VS2008 через TDD.Net. Добавление [RequiresSta] к моему тесту класс не помог

У кого-либо есть решение, которое сохраняет меня от изменения ThreadOption во время моих тестов (например, через свойство - что ужасный взлом)???

14
задан Community 23 May 2017 в 11:54
поделиться

1 ответ

Я действительно думаю, что вы должны использовать макеты для всего, а не для EventAggregator. Это совсем не трудно сделать... Я не думаю, что ответ по ссылке доказывает что-либо о тестируемости EventAggregator.

Вот ваш тест. Я не использую MSpec, но вот тест в Moq. Вы не предоставили никакого кода, поэтому я основываюсь на приведенном по ссылке коде. Ваш сценарий немного сложнее, чем сценарий по ссылке, потому что другой ОП просто хотел знать, как проверить, что Subscribe вызывается, но вы на самом деле хотите вызвать метод, который был передан в subscribe... что-то более сложное, но не очень.

//Arrange!
Mock<IEventAggregator> eventAggregatorMock = new Mock<IEventAggregator>();
Mock<PlantTreeNodeSelectedEvent> eventBeingListenedTo = new Mock<PlantTreeNodeSelectedEvent>();

Action<int> theActionPassed = null;
//When the Subscribe method is called, we are taking the passed in value
//And saving it to the local variable theActionPassed so we can call it.
eventBeingListenedTo.Setup(theEvent => theEvent.Subscribe(It.IsAny<Action<int>>()))
                    .Callback<Action<int>>(action => theActionPassed = action);

eventAggregatorMock.Setup(e => e.GetEvent<PlantTreeNodeSelectedEvent>())
                   .Returns(eventBeingListenedTo.Object);

//Initialize the controller to be tested.
PlantTreeController controllerToTest = new PlantTreeController(eventAggregatorMock.Object);

//Act!
theActionPassed(3);

//Assert!
Assert.IsTrue(controllerToTest.MyValue == 3);
16
ответ дан 1 December 2019 в 06:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: