私は、nUnitテストを実行するために、Using the WPF Dispatcher in unit testsの提案に従おうとしています。単体テストでWPFディスパッチャを使用する正しい方法
私は以下のように私のユニットテストを書くとき、それは動作します:
[Test]
public void Data_Should_Contain_Items()
{
DispatcherFrame frame = new DispatcherFrame();
PropertyChangedEventHandler waitForModelHandler = delegate(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "Data")
{
frame.Continue = false;
}
};
_myViewModel.PropertyChanged += waitForModelHandler;
Dispatcher.PushFrame(frame);
Assert.IsTrue(_myViewModel.Data.Count > 0, "Data item counts do not match");
}
私はDispatcherUtilの提案を使用しようとする場合は、それが動作しません:
[Test]
public void Data_Should_Contain_Items()
{
DispatcherUtil.DoEvents();
Assert.IsTrue(_myViewModel.Data.Count > 0, "Data item counts do not match");
}
public static class DispatcherUtil
{
[SecurityPermissionAttribute(SecurityAction.Demand, Flags = SecurityPermissionFlag.UnmanagedCode)]
public static void DoEvents()
{
DispatcherFrame frame = new DispatcherFrame();
Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background,
new DispatcherOperationCallback(ExitFrame), frame);
Dispatcher.PushFrame(frame);
}
private static object ExitFrame(object frame)
{
((DispatcherFrame)frame).Continue = false;
return null;
}
}
I DispatcherUtilを使用している場合、ExitFrameの呼び出しがデータが準備が整う前に早すぎるように見えます。
DispatcherUtilを正しく使用していませんか?これは、ビューモデルからのコールバックを待つのではなく、ディスパッチャーを処理するためのより良い方法のようです。
あなたはPropertyChangedEventHandlerは、「データ」の特性のために呼び出されただけの場合は、テストしようとしていますか?もしそうなら、なぜあなたはディスパッチャーを関与させる必要がありますか?また、ハンドラをアタッチするために_myViewModelを使用しないでください。 – Phil
@Phil:_myViewModelがインスタンス化されると、コンストラクタはasyn呼び出しを行います。その呼び出しが完了すると、_myViewModel.Dataはいくつかの値を持つ必要があります。実際にDataが実装されていることをテストしようとしていますが、asyn呼び出しの結果Dataにデータが入力されているという事実が私に何らかの問題を引き起こしています。 Dispatcherを処理する必要のある単体テストでPropertyChangedイベントを聴かなくてもいいです。 – Flack