2

我使用White自动化框架创建了一个集成测试。这是集成测试的开始:

var app       = Application.Launch("WPFIntegrationTest.exe");
var window    = app.GetWindow("MainWindow");

但是,我想获得一个White.Core.UIItems.WindowItems.Window在新进程中不“启动”应用程序的实例。然后,这将允许我注入任何MainWindow具有的依赖项,以便我可以有选择地模拟/存根它们。

作为我正在寻找的一个例子,这是我希望我能写的代码:

var myWindow  = new MainWindow();
var window    = White.Core.UIItems.WindowItems.Window(myWindow);

有什么方法可以使用 White 自动化框架实现这一目标?

4

1 回答 1

1

听起来您所描述的是在同一进程中运行您的 White 测试代码和被测应用程序 - 是这样吗?

据我所知,白人作者不鼓励这样做 - 请参阅此白人常见问题解答页面上的问题 #9:

http://white.codeplex.com/wikipage?title=Other%20questions

白测可以和应用在同一个进程中运行吗?

不可以。White 不适合在这种模式下工作,因为这会导致线程问题。总的来说,将测试代码与被测应用程序代码耦合并不是一个好主意,因为它们会相互独立地发展。

不过,也许下面的文章会帮助你做你想做的事:

http://msdn.microsoft.com/en-us/magazine/cc163864.aspx

在上面的文章中,检查“图 5 - 启动应用程序”中的代码。

作者的方法似乎有点像您所描述的 - 他的代码似乎加载了一个程序集,使用它来创建 Form 对象的实例,然后启动一个单独的线程,在该线程中调用 Application.Run 来启动 Form。

一旦您的 AUT 运行,您应该能够在主线程中使用 White 附加到它。

也许这种技术会让您开始按照您希望的方式操作 AUT?

为方便起见,这里是文章中的图 5:

static Form LaunchApp(string exePath, string formName)
{
  Thread.Sleep(delay);
  Assembly a = Assembly.LoadFrom(exePath);
  Type formType = a.GetType(formName);
  Form resultForm = (Form)a.CreateInstance(formType.FullName);
  Thread t = new Thread(new ThreadStart(new AppState(resultForm).RunApp));
  t.ApartmentState = ApartmentState.STA;
  t.IsBackground = true;
  t.Start();
  return resultForm;
}

private class AppState
{
  public AppState(Form f) { FormToRun = f; }
  public readonly Form FormToRun;
  public void RunApp()
  {
    Application.Run(FormToRun);
  }
}
于 2011-09-09T20:49:18.107 回答