2015-04-27 40 views
1

我們使用NUnit來測試WPF控件。 文本夾具基本上會打開一個測試窗口,其中包含要在新線程上測試的控件。然後使用Microsoft UI自動化(UIA)與控件進行交互。單元測試WPF控件訪問子對話框

新線程顯示窗口並啓動調度程序。事情按預期工作。

我們遇到的問題是這個控件可以啓動一個對話框。一旦對話框啓動,我們需要與它交互並關閉它。我一直無法獲得此對話框的參考來完成此任務。

一個不起作用的解決方案是使用Application.Current.Windows獲取所有窗口,然後遍歷它們直到找到對話框。這不起作用,因爲在單元測試期間Application.Current = null。現在,如果我們只關心這個測試,我們可以實例化一個應用程序。但是這會干擾其他測試,因爲當Application變量超出範圍時(在測試結束時),應用程序將自動進入關閉模式。因此,其他測試將失敗(最顯着的原因是InitializeComponent通常會調用System.Windows.Application.LoadComponent,在關閉模式期間無法調用它)。

我想我們需要的是Application.Current.Windows的替代方案。

回答

1

我找到了解決我的問題的工作方案。

UIA發生了一些事件。其中之一表示新窗口已打開。

訂閱處理程序到WindowOpenedEvent:

Automation.AddAutomationEventHandler(WindowPattern.WindowOpenedEvent, AutomationElement.RootElement, TreeScope.Children, new AutomationEventHandler(NewWindowHandler)); 

public void NewWindowHandler(Object sender, AutomationEventArgs e) 
{ 
    AutomationElement element = (AutomationElement)sender; 
    if (element.Current.Name == "PUT YOUR NAME HERE") 
    { 
     HwndSource hSource = HwndSource.FromHwnd(new IntPtr(element.Current.NativeWindowHandle)); 
     MyWindow = hSource.RootVisual as WavefrontToolkit.FormulaEditor.FormulaEditor; 
     Assert.IsNotNull(_MyWindow); 
     } 
    } 
} 

在處理程序中,你不必已打開窗口的引用。但是,您可以從Win32手柄中獲取它。

我遇到的另一個問題是當窗口打開時測試會繼續。一些測試可能依賴於該窗口。爲了解決這個問題,我會延遲到窗口準備就緒。

while (MyWindow == null) 
{ 
    System.Threading.Thread.Sleep(10); 
}