Как выполнить модульное тестирование CanExecuteChanged и RaisePropertyChanged - PullRequest
1 голос
/ 19 июля 2011

Я пытаюсь применить строгий TDD и столкнулся с проблемой, связанной с DelegateCommands и проверкой, что CanExecute был вызван.

Это мои два теста: «Когда я выбираю элемент из списка, я должен иметь возможность добавлять дочерние элементы» «Если в списке не выбран ни один элемент, я не могу добавить дочерние элементы»

теперь первый тест проходит, потому что CanAddChildItems никогда не вызывается моим модульным тестом, поэтому я написал второй тест, чтобы убедиться, что CanAddChildItems вызывается. Это даже если я помещаю AddChildItems.RaiseCanExecuteChaned () в установщик SelectedListItem.

Очевидно, что приложение не работает должным образом без AddChildItems.RaiseCanExecuteChaned (), но я не могу это вставить, если у меня нет теста, который действительно его проверяет!

Так есть идеи, как я могу уверенно проверить этот сценарий?

1 Ответ

2 голосов
/ 20 июля 2011

Предположения:

Ваша модель представления предоставляет свойства и команды для привязки к представлению.

EnablesAddChildItemsIfAnItemHasBeenSelected()

   viewModel.AddChildItemsCommand.CanExecuteChanged += MarkNotificationReceived; // dummy handler in test fixture

   viewModel.SelectedItem = someItemVM;

   Assert.IsTrue(viewModel.AddChildItemsCommand.CanExecute(params))
   Assert.IsTrue(this.ReceivedCanExecuteChangedNotification) // flag in test fixture

Если вы часто делаете это, вы можете создать свои собственные служебные классы PropertyChangeListener / CanExecuteChangeListener и передать свою модель представления и имя свойства / команды.

DisablesAddChildItemsIfThereIsNoSelection
    viewModel.SelectedItem = someItemVM
    var addChildItemsCmd = viewModel.AddChildItemsCommand;
    var changeListener = new CanExecuteChangeListener(addChildItemsCmd);

    viewModel.SelectedItem = null

    Assert.IsFalse(addChilditemsCmd.CanExecute(params))
    Assert.IsTrue(changeListener.NotificationReceived)
...