Ошибка тестирования пользовательского интерфейса при отображении UIAlertController без кнопок

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

Когда мы запускаем наши тесты, они терпят неудачу в точке сразу после этого с:

UI Testing Failure - Did not receive view did disappear notification within 2.0s  

За другие ответы на SO, я пытался использовать addUIInterruptionMonitor обрабатывать оповещения, но безуспешно. Я думаю, это потому, что на UIAlertController, Поскольку для оповещения не может быть предпринято никаких действий, монитор прерываний выглядит так:

addUIInterruptionMonitor(withDescription: "Loading") { handler in  
    return true  
}

Даже с этим, хотя, я получаю ту же ошибку. Как я могу обойти это?

РЕДАКТИРОВАТЬ: Соответствующий код тестирования пользовательского интерфейса ниже:

class UI_Tests: XCTestCase {
    override func setUp() {
        super.setUp()

        continueAfterFailure = true

        XCUIApplication().launch()
    }

    func testLogin() {
        let app = XCUIApplication()
        let tablesQuery = app.tables

        let secureTextField = tablesQuery.cells.containing(.staticText, identifier:"PIN").children(matching: .secureTextField).element
        secureTextField.tap()
        secureTextField.typeText("1234")

        app.buttons["Login"].tap()

        addUIInterruptionMonitor(withDescription: "Loading") { handler in
            return true
        }

        // Test failure occurs here.

        let searchField = tablesQuery.searchFields.element(boundBy: 0)
        searchField.tap()
        searchField.typeText("hey")
    }
}

2 ответа

Решение

После обращения к Apple DTS выясняется, что при отображении прерывания пользовательского интерфейса / UIAlertController который отклоняет на основе тайм-аута, что вам нужно объединить монитор прерываний пользовательского интерфейса с ожиданием на основе тайм-аута (в противном случае монитор прерываний вернется до того, как предупреждение будет отклонено!).

Используя пример тестирования пользовательского интерфейса в вопросе, этот подход выглядит следующим образом:

class UI_Tests: XCTestCase {
    override func setUp() {
        super.setUp()

        continueAfterFailure = true

        XCUIApplication().launch()
    }

    func testLogin() {
        let app = XCUIApplication()
        let tablesQuery = app.tables

        let secureTextField = tablesQuery.cells.containing(.staticText, identifier:"PIN").children(matching: .secureTextField).element
        secureTextField.tap()
        secureTextField.typeText("1234")

        app.buttons["Login"].tap()

        addUIInterruptionMonitor(withDescription: "Loading") { alert in
            self.expectation(for: NSPredicate(format: "exists == false"), evaluatedWith: alert, handler: nil);
            self.waitForExpectations(timeout: 10, handler: nil)
            return true
        }

        // Test failure occurs here.

        let searchField = tablesQuery.searchFields.element(boundBy: 0)
        searchField.tap()
        searchField.typeText("hey")
    }
}

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

Использовать UIActivityIndicatorView вместо UIAlertController,

Тесты пользовательского интерфейса предполагают, что оповещения будут обрабатываться пользователем, а не исчезать самостоятельно. Тесты пользовательского интерфейса также учитывают показатели активности и автоматически ждут их исчезновения, прежде чем продолжить.

Другие вопросы по тегам