5

どこから始めればいいのかわかりませんが、私がどこにいるのか、何を達成したいのかについて簡単に説明します。私はMVVMでの単体テストにまったく慣れておらず、PRISMデリゲートコマンドのプロパティを使用して公開したコマンドをテストするのに苦労しています。私のデリゲートコマンドは、実際の結果を取得できるように待機する必要があるasyncメソッドを呼び出します。以下は、私がテストしたかったメソッドによって呼び出されるasycメソッドです。

 async void GetTasksAsync()
        {
            this.SimpleTasks.Clear();
            Func<IList<ISimpleTask>> taskAction = () =>
                {
                    var result = this.dataService.GetTasks();
                    if (token.IsCancellationRequested)
                        return null;
                    return result;
                };
            IsBusyTreeView = true;

            Task<IList<ISimpleTask>> getTasksTask = Task<IList<ISimpleTask>>.Factory.StartNew(taskAction, token);
            var l = await getTasksTask;          // waits for getTasksTask


            if (l != null)
            {
                foreach (ISimpleTask t in l)
                {
                    this.SimpleTasks.Add(t); // adds to ViewModel.SimpleTask
                }
            }
        }

上記のasyncメソッドを呼び出すVMのコマンドもここにあります

  this.GetTasksCommand = new DelegateCommand(this.GetTasks);
      void GetTasks()
        {
                GetTasksAsync();
        }

そして今、私のテスト方法は次のようになります

 [TestMethod]
        public void Command_Test_GetTasksCommand()
        {
          MyViewModel.GetTaskCommand.Execute(); // this should populate ViewModel.SimpleTask 
          Assert.IsTrue(MyBiewModel.SimpleTask != null)
        } 

現在私が得ているのは、ViewModel.SimpleTask = nullです。これは、非同期メソッドが終了するのを待たないためです。すでにスタックオーバーフローに関連するトピックがいくつかあることは理解していますが、DelegateCommandsに関連するものが見つかりませんでした。

4

1 に答える 1

10

GetTasksAsyncメソッドは、実際にタスクを待つことができるようにタスクを返す必要があります。

Channel9のこのシリーズ、特にあなたの問題を説明するこのエピソードをお勧めします。

明確にするために:GetTasksAsyncの署名をに変更するだけです

Task GetTasksAsync();

これを行うことができます:

var t = GetAsync();
t.Wait();
Assert(...);

コマンドによって呼び出される実際のメソッドではなく、単体テストでコマンドを本当にテストしたい場合は、ViewModelのフィールドを使用して、待機するタスクを保存するか(それほどクリーンではない)、DelegateCommandを次のようなものに置き換えることができます。この投稿:Awaitable DelegateCommand

更新:ブログ投稿に加えて、PRISMを使用していることを考慮すると、PRISMと同じチームのProjectKonaを確認する必要があります。彼らは実際にAsyncHandlersをサポートするためにDelegateCommandを実装しました

于 2013-03-26T07:50:19.977 に答える