1

私は厳密な TDD を実践しようとしていますが、DelegateCommands に関連する問題に遭遇し、CanExecute が呼び出されたことをテストしています。

これらは私の 2 つのテスト タイトルです。「リストからアイテムを選択すると、子アイテムを追加できるはずです」

CanAddChildItems が単体テストによって呼び出されることはないため、最初のテストに合格するようになりました。そのため、CanAddChildItems が呼び出されることを確認するために 2 番目のテストを作成しました。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 に答える