单元测试WPF控件"获取对子对话框的访问权限"



我们使用NUnit来测试WPF控件。文本固定装置基本上打开一个测试窗口,其中包含要在新线程上测试的控件。然后使用Microsoft UI Automation(UIA)与控件进行交互。

新线程显示窗口并启动调度程序。事情按预期进行。

我们遇到的问题是,此控件可以启动对话框。一旦对话框启动,我们需要与它交互并关闭它。我无法获得此对话框的引用来完成此任务。

一个不起作用的解决方案是使用Application。现在的Windows来获取所有窗口,然后在它们之间迭代,直到找到对话框。这不起作用,因为在单元测试应用程序期间。电流=空。现在,如果我们只关心这个测试,我们就可以实例化一个应用程序。然而,这将干扰其他测试,因为当我们的应用程序变量超出范围时(在测试结束时),应用程序将自动进入关闭模式。因此,其他测试将失败(最值得注意的是,InitializeComponent通常调用System.Windows.Application.LoadComponent,而在关闭模式下无法调用该组件)。

我想我们需要的是应用程序的替代方案。现在的Windows。

我找到了一个有效的问题解决方案。

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);
}

最新更新