如何对CanExecuteChanged和RaisePropertyChanged进行单元测试

时间:2011-07-19 19:51:25

标签: wpf tdd delegatecommand canexecute

我正在尝试练习严格的TDD并遇到与DelegateCommands相关的问题,并测试是否已调用CanExecute。

这是我的两个测试题目: “当我从列表中选择一个项目时,我应该能够添加子项目” “如果没有从列表中选择任何项目,我将无法添加子项目”

现在第一个测试通过,因为我的单元测试从不调用CanAddChildItems,所以我编写了第二个测试以确保调用CanAddChildItems。即使我将AddChildItems.RaiseCanExecuteChaned()放入SelectedListItem的setter中也不行。

显然,如果没有AddChildItems.RaiseCanExecuteChaned(),应用程序的行为并不是必需的,但如果我没有真正测试它的测试,我就不能把它放进去!

所以我可以自信地测试这种情况吗?

1 个答案:

答案 0 :(得分:2)

假设:

您的ViewModel公开要绑定到的视图的属性和命令。

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并传入您的viewmodel和property / command名称。

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)