white.core.uiitems.windowitems.windowのインスタンスを取得する方法は、統合テスト内で作成されたWPFウィンドウを自動化できるものですか?
-
28-10-2019 - |
質問
を使用して統合テストを作成しました 白 自動化フレームワーク。これが統合テストの開始です。
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 Automation Frameworkを使用してこれを達成できる方法はありますか?
解決
あなたが説明しているのは、あなたの白いテストコードと同じプロセスでテスト中のアプリケーションを実行しているように聞こえます - そうですか?
私が言うことができることから、白人の著者はそれを思いとどまらせます - この白いFAQページで質問#9を参照してください:
http://white.codeplex.com/wikipage?title=other%20questions
ホワイトテストはアプリケーションと同じプロセスで実行できますか?
いいえ。ホワイトは、このモードで動作するようには設計されていません。これにより、スレッドの問題が発生する可能性があるためです。原則として、テストコードとテストコードの下でアプリケーションを結合することは、互いに独立して進化することをお勧めします。
それでも、おそらく以下の記事はあなたが望むことをするのに役立ちます:
http://msdn.microsoft.com/en-us/magazine/cc163864.aspx
上記の記事では、「図5-アプリの起動」のコードを確認してください。
著者のアプローチは、あなたが説明しているもののように見えます - 彼のコードはアセンブリをロードし、それを使用してフォームオブジェクトのインスタンスを作成し、application.runが呼び出される別のスレッドを起動するように見えます。
自動が実行されたら、メインスレッドで白を使用してそれに取り付けることができるはずです。
おそらく、そのテクニックは、あなたが望んでいた方法で自動を操作することを始めさせるでしょうか?
便利なため、記事の図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);
}
}