Я разрабатываю приложение в WPF с фреймворком MVVMLight.

Я пытаюсь сделать модульные тесты (я в этом новичок). Поэтому я пытаюсь смоделировать свое представление, подписавшись на событие CanExecuteChanged в моей команде и проверяю, правильно ли оно вызывается. Но когда я это делаю, он никогда не вызывается, даже если я вызываю метод RaiseCanExecuteChanged.

Вот очень простой пример:

bool testCanExec = false;
var testCmd = new RelayCommand(
                     execute:    () => { System.Diagnostics.Debug.WriteLine($"Execute call"); },
                     canExecute: () => { System.Diagnostics.Debug.WriteLine($"CanExecute call"); return testCanExec; }
                );
testCmd.CanExecuteChanged += ((sender, args) => { System.Diagnostics.Debug.WriteLine($"CanExecuteChanged call"); });
testCanExec = true;
testCmd.RaiseCanExecuteChanged(); // <= nothing in output
testCmd.Execute(null);            // <= output: "CanExecute call", "Execute call"

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

Спасибо за вашу помощь.

1
Corabox 1 Мар 2018 в 19:24

1 ответ

Лучший ответ

Метод RelayCommand RaiseCanExecuteChanged просто вызывает CommandManager.InvalidateRequerySuggested(), что не имеет никакого эффекта в контексте модульного теста: https://github.com/lbugnion/mvvmlight/blob/b23c4d5bf6df654ad885be26ea053fb0efa04973/V3/ GalaSoft.MvvmLight / GalaSoft.MvvmLight% 20 (NET35) /Command/RelayCommandGeneric.cs

..поскольку нет элементов управления, которые подписались на событие CommandManager.RequerySuggested.

Кроме того, обычно вы не должны писать модульные тесты, которые проверяют функциональность стороннего фреймворка. Вероятно, вам следует сосредоточиться на тестировании собственной пользовательской функциональности.

Но если вы хотите протестировать метод CanExecute, вы должны просто вызвать его вместо того, чтобы вызывать событие CanExecuteChanged:

bool b = testCmd.CanExecute(null);  
1
mm8 1 Мар 2018 в 19:27