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

あなたが説明しているのは、ホワイトテストコードとテスト対象のアプリケーションを同じプロセスで実行しているようですが、そうですか?

私が言うことができることから、白人の作者はそれを思いとどまらせます-この白人のFAQページの質問#9を参照してください:

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

ホワイトテストはアプリケーションと同じプロセスで実行できますか?

いいえ。ホワイトはこのモードで動作するようには設計されていません。これはスレッドの問題を引き起こす可能性があるためです。原則として、テストコードをテストコードの下のアプリケーションと結合することは、互いに独立して進化するため、お勧めできません。

それでも、以下の記事はあなたがやりたいことをするのに役立つかもしれません:

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

上記の記事で、「図5-アプリの起動」のコードを確認してください。

著者のアプローチは、あなたが説明しているものと少し似ているようです。彼のコードは、アセンブリをロードし、それを使用してFormオブジェクトのインスタンスを作成し、Application.Runが呼び出されてFormを起動する別のスレッドを起動するように見えます。

AUTが実行されると、メインスレッドでWhiteを使用してAUTに接続できるようになります。

おそらく、そのテクニックによって、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 に答える