Как получить экземпляр White.Core.UIItems.WindowItems.Window, который может автоматизировать окно WPF, созданное в интеграционном тесте? - PullRequest
2 голосов
/ 09 сентября 2011

Я создал интеграционный тест с использованием инфраструктуры автоматизации 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?

1 Ответ

1 голос
/ 10 сентября 2011

Звучит так, как будто вы описываете, что ваш тестовый код White и тестируемое приложение выполняются в одном и том же процессе.

Из того, что я могу сказать, автор White не одобряет этого - смотритевопрос № 9 на этой белой странице часто задаваемых вопросов:

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

Может ли белый тест выполняться в том же процессе, что и приложение?

Нет.Белый не предназначен для работы в этом режиме, так как это может вызвать проблемы с многопоточностью.В принципе, не стоит объединять тестовый код с тестируемым приложением, так как они будут развиваться независимо друг от друга.

Тем не менее, приведенная ниже статья поможет вам сделать то, что нужно.Вы хотите:

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

В приведенной выше статье проверьте код в «Рис. 5 - Запуск приложения».

Авторский подход выглядит примерно так:вы описываете - его код, кажется, загружает сборку, использует его для создания экземпляра объекта Form, а затем запускает отдельный поток, в котором вызывается Application.Run для запуска формы.

Как только ваш 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);
  }
}
...