Как написать модульный тест для нажатия кнопки? - PullRequest
0 голосов
/ 13 декабря 2018

Здесь я пытаюсь проверить блок тестов для просмотра контроллера.- У меня есть контроллер просмотра с кнопкой и меткой.- Когда вы нажимаете на кнопку, он вызывает другой метод.который подает данные для изменения текста метки действия кнопки.
- Я хочу проверить, запускает ли этот метод этот метод или нет?без добавления какого-либо логического или возвращаемого типа функции.

Вот мой код.

class ViewController: UIViewController {

    @IBOutlet weak var buttonFetch: UIButton?

    @IBOutlet weak var nameLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

    }

    @IBAction func fetchUser() {
        self.nameLabel.text = self.getUser()
    }

    func getUser() ->String {
        return User.data()
    }
}

struct User  {
    static func data()->String{
        return "Apple"
    }
}

Вот мой тестовый пример

func testFetchUserAction() {
        controller.buttonFetch?.sendActions(for: .touchDown)
        // I want to test the method getUser from viewcontroller gets called or not
        // some thing like this XCTAssert(self.controller.getUser(),"not called")
        XCTAssertEqual(self.controller.nameLabel.text!, "Apple")

    }

Ответы [ 4 ]

0 голосов
/ 14 декабря 2018

Чего не хватает:

Обязательно позвоните куда-нибудь loadViewIfNeeded().

Это может быть в тесте или в setUp().Это загрузит ваши розетки и вызовет viewDidLoad().

Затем, насколько это возможно, проверьте результат вызова действия вместо того, был ли вызван метод.Вы сделали это в своем примере утверждения.

Я бы также добавил, что правильное действие для кнопок почти всегда .touchUpInside, а не .touchDown.Это позволяет пользователю нажать кнопку, а затем перетащить, чтобы изменить свое мнение.«Я не хочу толкать это в конце концов.»

0 голосов
/ 13 декабря 2018

Я пробовал, как показано ниже, он прошел тест.Но я не уверен, что это правильно или нет?

XCTAssertNotNil(self.controller!.getUser, "get user method not called")
0 голосов
/ 13 декабря 2018

Вы пробовали, как показано ниже ..

func testFetchUserAction() {

    self.controller.nameLabel.text = nil

    //Use this line, If you assigned touchUpInside to your button action
    controller.buttonFetch?.sendActions(for: .touchUpInside)

    //Use this line, If you assigned touchDown to your button action
    controller.buttonFetch?.sendActions(for: .touchDown)

    XCTAssert(self.controller.nameLabel.text != nil, "not called")

}

Примечание. Чтобы сделать тестовый случай намеренно неудачным, вы можете изменить UIControl.Event в sendActions

0 голосов
/ 13 декабря 2018

Нашли что-то похожее на другой ответ, попытались что-то подобное?Источник: Как добавить действие нажатия для кнопки в «модульном тестировании» и показать оповещение

func testTappingLoginButton_ShouldPresentAlert() {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let sut = storyboard.instantiateInitialViewController() as! ViewController
    sut.loadViewIfNeeded()
    let alertVerifier = QCOMockAlertVerifier()

    sut.loginButton.sendActions(for: .touchUpInside)

    XCTAssertEqual(alertVerifier.presentedCount, 1)
}

Дайте мне знать, работает оно или нет!

...