Очистка при неудачном тестировании xUnit и White - PullRequest
1 голос
/ 13 апреля 2019

Я начинаю изучать использование белого пользовательского интерфейса с XUnit.

Базовая структура для моих тестов

  • Откройте приложение
  • Test Something
  • Закрыть приложение

Это очень хорошо работает, когда тест пройден. Однако при сбое теста приложение не закрывается. Если несколько тестов не пройдены, это приведет ко множеству открытых экземпляров моего приложения.

Чтобы обойти это, я использую блоки try и finally, но это не очень приятно.

Есть ли альтернативный вариант, который обеспечивает такое же поведение при очистке, но выглядит немного лучше? Как метод «RunOnAssertFail»?

[Fact]
public void MainWindowCreated()
{
    bool testFailed = false;

    Application application = Application.Launch(@"C:\Program\Program.exe");
    Window mainWindow = GetWindow(application, "MainWidndow", 500);

    try
    {
        testFailed = true;
        mainWindow.Should().NotBe(null, ". Main Widndow could not be found");
        testFailed = false;
    }
    finally
    {
        if (testFailed)
        {
            application.Close();
        }
    }

    /*
     * Rest of test case
     */

    application.Close();
}

private static Window GetWindow(Application application,
    string windowName,
    int timeoutAfterMilliseconds)
{
    Window window = null;

    try
    {
        window = Retry.For(
            () => application.GetWindows().First(
                windowX => windowX.Title.Trim().Equals(windowName.Trim())),
            TimeSpan.FromMilliseconds(timeoutAfterMilliseconds));
    }
    catch (InvalidOperationException)
    {

    }

    return window;
}

Требуется xUnit , Белый и Свободные утверждения для запуска.

Ответы [ 2 ]

0 голосов
/ 14 апреля 2019

Как насчет реализации IDisposable в вашем тестовом классе и использования этого для очистки?

0 голосов
/ 13 апреля 2019

После игры я понял, что утверждения - это исключение, а не утверждение.

Поэтому, чтобы помочь привести в порядок, более подходящим является блок try catch

try
{
    mainWindow.Should().NotBeNull("because this window is required for the rest of the test");
}
catch(XunitException)
{
    application.Close();
    throw;
}

Однако, это все еще не идеально.

...