我正在運行一個簡單的WPF應用程序,它使用基於事件/ TPL的方法來處理數據。 三大類在本例中使用(查看,演示,模型)如何單元測試WPF + TPL
Snip of Presenter:
internal void btn_test_Click(object sender, EventArgs e)
{
Task<Person>.Factory.StartNew(() => GetPerson(id)).ContinueWith(UpdateTest, TaskScheduler.FromCurrentSynchronizationContext());
}
public Person GetPerson(int id)
{
Person p = Model.GetPerson(id);
return p;
}
private void UpdateTest(Task<Person> task)
{
Person p = task.Result;
window.tb_test.Text = p.ID + " " + p.Name; // PROBLEM HERE
}
所以,我越來越從查看的事件,開始一個新的任務,從我的數據庫或服務獲取數據和更新UI之後。工作完美。
現在我想爲這個場景創建一個單元測試。顯示的值是否正確?
[TestMethod]
SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());
waitHandle = new ManualResetEvent(false);
WPF.MainWindowView mwv = new MainWindowView();
mwv.btn_test.RaiseEvent(new RoutedEventArgs(ButtonBase.ClickEvent));
mwv.tb_test.TextChanged += (s, e) => waitHandle.Set();
waitHandle.WaitOne();
Assert.AreEqual("43 displayvalue", mwv.tb_test.Text);
WPF應用程序工作正常,但在測試時會出現InvalidoperationException。我試圖用一個調度器,用於更新UI組件調用
window.tb_test.Dispatcher.BeginInvoke((ThreadStart)delegate {window.tb_test.Text = t.ID + " " + t.Name});
在UpdateTest
,但「tb_test.textChanged」事件沒有得到我的測試模塊調用altough應用程序本身工作完全正常。
你的問題不是很清楚。 textChanged從哪裏來?我看不到它已在您的SUT(被測系統)中使用過。您想要測試什麼「特定」場景,以及您的測試方法名稱是否丟失。在你的SUT中,你有私人的無效UpdateTest(任務任務),這個被調用? –
Spock