我正在尝试练习严格的TDD并遇到与DelegateCommands相关的问题,并测试是否已调用CanExecute。
这是我的两个测试题目: “当我从列表中选择一个项目时,我应该能够添加子项目” “如果没有从列表中选择任何项目,我将无法添加子项目”
现在第一个测试通过,因为我的单元测试从不调用CanAddChildItems,所以我编写了第二个测试以确保调用CanAddChildItems。即使我将AddChildItems.RaiseCanExecuteChaned()放入SelectedListItem的setter中也不行。
显然,如果没有AddChildItems.RaiseCanExecuteChaned(),应用程序的行为并不是必需的,但如果我没有真正测试它的测试,我就不能把它放进去!
所以我可以自信地测试这种情况吗?
答案 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)