UITextFieldDelegate не вызывается в XCTestCase - PullRequest
0 голосов
/ 19 ноября 2018

Я только начинаю знакомиться с написанием тестов с использованием XCTestCase и изучаю его возможности.У меня есть простое (если придумано) приложение, которое загружает экран с кнопкой и текстовым полем.Когда текстовое поле выбрано, контроллер представления заполняет текстовое поле:

public func textFieldDidBeginEditing(_ textField: UITextField) {
    textField.text = "abcd"
}

У меня также есть функциональность, которая выбирает поле при нажатии кнопки:

@IBAction public func selectField(_ sender: Any?) {
    print("button press")
    textfield.becomeFirstResponder()
}

Код в моем тестовом примере, программно нажимает кнопку, используя vc.button.sendActions(for: .touchUpInside)

Однако, похоже, что текстовое поле никогда не становится первым респондентом, и, таким образом, методы делегата не вызываются.Ниже приведен полный класс тестовых примеров:

var vc: ViewController!

override func setUp() {
    let sb = UIStoryboard(name: "Main", bundle: nil)
    vc = sb.instantiateInitialViewController() as? ViewController
    _ = vc.view
}

override func tearDown() {

}

func test_textfieldPopulatesOnSelection() {

    vc.button.sendActions(for: .touchUpInside)

    let expectation = XCTestExpectation(description: "waiting for textfield to become first responder")
    DispatchQueue.main.asyncAfter(deadline: .now() + 5.0) {
        print("textfield.text: \(self.vc.textfield.text ?? "")")
        expectation.fulfill()
    }

    wait(for: [expectation], timeout: 13.0)
}

Хотя я понимаю, что, вероятно, я путаю понятия UI-тестирования и модульного тестирования, мне все еще интересно, почему мои методы делегата не вызываются.

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

У меня есть простое (если придумано) приложение, которое загружает экран с кнопкой и текстовым полем

Нет, нет, по крайней мере, в каком-то значимом смысле этого слова.Понятие "загружает экран".У вас есть контроллер представления и его представление, созданные в setup, но вы ничего с ними не сделали.Контроллер представления не является частью иерархии контроллера представления приложения, и его представление не находится в интерфейсе, и поэтому содержащееся в нем текстовое поле не находится в интерфейсе.Текстовое поле, отсутствующее в интерфейсе, не будет делать ничего.Он не может быть первым ответчиком, так как ему нечего ответить.Первый респондент является функцией окна приложения , и ваше текстовое поле не равно в любом окне.

В любом случае, вы используете здесь модульный тестошибочноЭто не так много, что вы совмещаете юнит-тесты с тестами пользовательского интерфейса;это то, что вы не понимаете, что тестирование является .Нет смысла проверять концепцию, согласно которой becomeFirstResponder делает текстовое поле первым отвечающим;Вы знаете , что это правда, поэтому проверять нечего.Ваша задача в модульном тестировании - проверить функциональность вашего приложения , а не тестировать инфраструктуру Cocoa.

0 голосов
/ 20 ноября 2018

Методы делегатов не вызываются в модульных тестах.Тесты должны вызывать методы делегата, как если бы они были вызваны Cocoa Touch.

Таким образом, чтобы проверить textFieldDidBeginEditing(_), модульному тесту необходимо вызвать его явно.

...