1

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

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

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

显然,如果没有 AddChildItems.RaiseCanExecuteChaned(),应用程序不会按要求运行,但如果我没有真正测试它的测试,我就不能把它放进去!

那么有什么想法可以让我自信地测试这个场景吗?

4

1 回答 1

3

假设:

您的 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 并传入您的视图模型和属性/命令名称。

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)
于 2011-07-20T05:45:35.727 回答