私はUserControl
がLoaded
イベントにEventAggregator
というメッセージを発行しています。これをテストして(そしてイベントを発生させたLoaded
を取得するため)、私は現在、ウィンドウを作成してそれにコントロールを追加してから、Loaded
イベントが発生するのを待っています。WPFコントロールをウィンドウに追加しないでテストする
コントロールを作成してウィンドウに追加することなくLoaded
イベントが発生するようにテストを設定する方法はありますか?例えば
:
[Test, RequiresSTA]
public void active_thingy_message_is_published_on_loaded()
{
const string TestMsg = "Active thingy changed";
using (AutoResetEvent loadedEvent = new AutoResetEvent(false))
{
DummyEventService eventService = new DummyEventService();
DummyControl control = new DummyControl(eventService, TestMsg);
control.Loaded += delegate { loadedEvent.Set(); };
Assert.That(eventService.Message, Is.Null, "Before.");
Window window = new Window { Content = control };
window.Show();
loadedEvent.WaitOne();
window.Dispatcher.InvokeShutdown();
Assert.That(eventService.Message, Is.EqualTo(TestMsg), "After.");
}
}
private class DummyControl : UserControl
{
public DummyControl(DummyEventService eventService, string testMsg)
{
Loaded += delegate { eventService.Publish(testMsg); };
}
}
private class DummyEventService
{
public string Message { get; private set; }
public void Publish(string msg) { Message = msg; }
}
更新
私は「 "...テスト" に "ユニットテスト..." からタイトルを変更して、タグを交換しました手段 - 前記テスト "と"テスト "。
私は建設的ではないので、これがどのクラスのテストであるか正確に分けないほうがいいでしょう。はい、これは「単体テスト」ではないと主張できますが、それは役に立たないことです。コントロールのライフサイクルに依存する問題をテストしたいと思います。これにはLoaded
イベントが含まれています。これは重要な回帰テストです。第三者のコンポーネントとして、私はLoaded
で発生したメッセージに依存して制御できません。
ウィンドウにコントロールを追加せずにLoaded
イベントを発生させることはできますか?
ウィンドウを擬似/モックする必要があります...しかし、これはもはや単体テストのようには見えません。 –
@Henkどのようにして偽のウィンドウが表示され、私のユーザコントロールがロードされ、その結果、 'Loaded'イベントが発生しますか?あなたは、リフレクション経由Loadイベントを上げてみてください –
: http://stackoverflow.com/questions/198543/how-do-i-raise-an-event-via-reflection-in-net-c –