ユニットテストMVVMを初めて使用し、プロジェクトでPRISMを使用しています。私は現在のプロジェクトで単体テストを実装しており、非同期メソッドを呼び出すDelegateCommandがどれほど完全であるかを私に教えてくれるリソースをオンラインで見つけることはできません。これは、MVVMの非同期メソッドを単体テストする方法について、私のポストの投稿に続く質問です。非同期メソッドをasync TestMethodを使用してテストできると回答しています。How to Unit Test a ViewModel with async method.このシナリオは、テストするメソッドがパブリックメソッドである場合にのみ機能します。ユニットのテスト方法MVVMで非同期メソッドを呼び出すDelegateCommand
問題は私がDelegateCommandをテストしたいのですが、これは私が他のクラスで公開したい唯一の公開の詳細であり、他はすべてプライベートであるためです。私は自分のプライベートな方法を公開することができますが、私はそれを悪い設計として決してしません。私はこれについてどうやって行くのか分かりません - DelegateCommandはテストする必要がありますか、これを回避するための他の作業がありますか?私は他の人がこれについてどうやって行って、何とか私を正しい道に導いてくれることを知りたいと思っています。ここで
は再び
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
}
}
}
また、ここに私のコードです
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)
}
ようになり、私のVMでコマンドです
現在、私はViewModel.SimpleTask = nullを取得しています。なぜなら、Asyを待たずにncメソッドを終了します。
TaskCommandのHTTPSの私の実現を見てみましょう: //github.com/Catel/Catel/blob/develop/src/Catel.MVVM/Catel.MVVM.NET40/MVVM/Commands/TaskCommand.csと使用例https://github.com/Catel/Catel.Examples /tree/master/src/NET/Catel.Examples.WPF。TaskCommand –
こんにちは@AlexanderLogger、私はCatelのTaskCommandがCatelのフレームワークの大部分として優れた実装であることに同意しますが、単体テストでVM.MyTaskCommand.Executeを使用するための適切な待機時間をまだ把握していません。 AFAIKは、Taskオブジェクトの代わりにvoidを返すためです。 Awaitを使用して適切な例外伝播を得ることができます。 voidを返すので、最終的な例外を取り除くだけです。ですから、ダニエルが提案したAsyncCommandが好きなのです。それでも、私はCatel側で何かを逃しているかもしれないので、もし私が間違っていたら、教えてください。 –