Я использую библиотеку Moq для имитации интерфейсов, предоставляемых библиотекой Prism в моем проекте MVVM WPF, чтобы протестировать их как часть моей модели просмотра. В частности, у меня есть модель просмотра, которая использует призмы IDialogService
.
. Я хочу провести модульную проверку, открывает ли выполнение определенной команды c диалоговое окно c с указанными c параметрами. Вот что я сделал для этого:
// Arrange
var mockDialogService = new Mock<IDialogService>();
var viewModel = SetupViewModel(mockDialogService.Object);
// Act
viewModel.OpenNewStockDialogueCommand.Execute();
// Assert
mockDialogService.Verify(s => s.ShowDialog(
It.IsAny<string>(),
It.IsAny<IDialogParameters>(),
It.IsAny<Action<IDialogResult>>()),
Times.Once);
Соответствующая часть происходит в разделе Assert моего теста. Метод ShowDialog
принимает следующие аргументы:
- имя:
string
- параметры:
IDialogParameters
- обратный вызов:
Action<IDialogResult>
Вот некоторая документация по Prism Dialogservice, для заинтересованных
Теперь, насколько я понимаю, если я вызову метод ShowDialog
перед вызовом Метод Verify
, независимо от того, какие параметры я ему передаю, метод Verify
должен выполняться без исключения. Как вы, наверное, догадались, когда я был на форуме, на самом деле он вызывает исключение и представляет мне следующее сообщение:
Message:
Moq.MockException :
Expected invocation on the mock once, but was 0 times: s => s.ShowDialog(It.IsAny<string>(), It.IsAny<DialogParameters>(), It.IsAny<Action<IDialogResult>>())
Performed invocations:
Mock<IDialogService:1> (s):
IDialogService.Show("NewStockDialogue", ?CurrentStock=FHAA.Stock, Action<IDialogResult>)
Итак, вы go. Для меня это очень странно. Кажется, что метод действительно вызывается, как указано в «Выполненном вызове», но что-то в параметрах не соответствует. Есть ли у кого-нибудь идея, почему?
Также важно отметить, что я на самом деле не хочу помещать здесь It.IsAny
, у меня есть некоторые полуфиксированные значения, которые я хочу проверить, но поскольку это не так событие работает с It.IsAny
, на что я надеюсь, что он будет работать с ограничениями.
Большое спасибо за ваше время, ваша помощь очень ценится!
EDIT
Оказывается, я на самом деле тестировал IDialogService.Show
вместо ShowDialog
. Это была проблема
dialogService.Show(DialogueNames.NewStock, parameters, OnNewStockDialogueClosed);