Модульные тесты MVVM - шина сообщений работает только один раз
Я пытаюсь написать некоторые модульные тесты для модели представления, используя SimpleMvvmToolkit, и некоторые из этих тестов требуют отправки сообщения на шину сообщений для запуска событий внутри модели представления. Проблема в том, что я могу использовать шину сообщений только один раз; первый тест, который отправляет сообщение, проходит, но два других, которые отправляют сообщение, не пройдены. Но если я запускаю каждый тест по отдельности, все три теста проходят, и если я меняю порядок, то первый тест, независимо от того, какой это тест, проходит.
Вот образец одного из тестов.
[TestMethod]
public void DeleteRequest()
{
// mock the driver transaction service
var driverTransactionService =
new Mock<Services.IDriverTransactionService>();
var viewModel = new ValidationRequestViewModel(
driverTransactionService.Object);
driverTransactionService.Setup(dts =>
dts.DeleteValidationRequest(It.IsAny<Action<int>>(),
It.IsAny<Action<Exception>>(),
It.IsAny<int>()))
.Callback((Action<int> action, Action<Exception> ex, int id) =>
action.Invoke(requestId));
// make a validation request and add to the collection
var validationRequest = new ValidationRequest...
var collection = viewModel.ValidationRequestView.SourceCollection as
ObservableCollection<ValidationRequest>;
collection.Add(validationRequest);
// delete the validation request; send the confirmation message as if
// the user clicked yes
viewModel.DeleteValidationRequest(validationRequest);
MessageBus.Default.Notify(
NotificationMessages.DeleteValidationRequestConfirmation,
this, new NotificationEventArgs<String>(null, null));
// verify the service call was made
driverTransactionService.Verify(dts =>
dts.DeleteValidationRequest(It.IsAny<Action<int>>(),
It.IsAny<Action<Exception>>(), requestId));
}
Поэтому я создаю макет службы (которая является оболочкой для службы WCF) и проверяю, что вызывается DeleteValidatonRequest для службы. В этом случае шина сообщений необходима, поскольку обычно появляется диалоговое окно подтверждения и отправляется сообщение DeleteValidationRequestConfirmation, если пользователь нажимает кнопку ОК.
Тест завершается неудачно в последней строке (Verify), и когда я отлаживаю, обработчик сообщения в модели представления никогда не выполняется, поэтому создается впечатление, что сообщение фактически никогда не отправляется. Опять же, это только сбой, если тест не является первым тестом для отправки сообщения на шину. Если он выполняется один или является первым, тест проходит.
Есть идеи? Все тесты независимы и не имеют общих свойств или переменных класса теста, поэтому я не понимаю, как они могут наступать друг на друга.
РЕДАКТИРОВАТЬ: я использовал отражение, чтобы вызвать защищенные методы в модели представления, которые сообщения обычно запускаются; это дает мне покрытие кода, которое я хочу, просто не проверяет, правильно ли модель представления отвечает на сообщения.
РЕДАКТИРОВАТЬ 2: Дерьмо, то же самое происходит с событиями PropertyChanged в модели представления. Обработчик событий срабатывает только в том случае, если тест выполняется независимо или является первым.
1 ответ
Я не знаком с SimpleMvvmToolkit, но я знаком с концепцией обмена сообщениями.
Не использовать MessageBus.Default
, Измените ваши ViewModels, чтобы иметь MessageBus
, или же IMessageBus
если он существует, параметр конструктора. Теперь ваши тесты будут изолированы, так что вы можете запустить их все сразу, и они должны пройти.
Кроме того, если IMessageBus
Интерфейс существует, вы можете его макетировать, что облегчит тестирование ваших ViewModels.