Метод тестирования в UITabBarController правильно устанавливает заголовок - PullRequest
0 голосов
/ 30 сентября 2018

В настоящее время я пытаюсь понять модульное тестирование в Swift 4. У меня есть класс с методом, который настраивает мои контроллеры представления.

Я хотел бы убедиться, что этот метод правильно устанавливает заголовок ViewController,

Однако я не могу понять, как написать этот тест?

Это мой код и тест до сих пор.

В настоящее время мои тесты не проходят с:

XCTAssertEqual failed: ("nil") is not equal to ("Optional("Favourites")") - 

Как можно проверить это поведение?Любая помощь приветствуется.

Контроллер

class MainTabBarController: UITabBarController {

    override func viewDidLoad() {
        super.viewDidLoad()

        setupTabBar()
        setupViewControllers()
    }

    // MARK:- Setup

    fileprivate func setupViewControllers() {
        viewControllers = [
            generateNavigationController(with: UIViewController(), title: "Favourites", image: UIImage(imageLiteralResourceName: "favorites")),
            generateNavigationController(with: UIViewController(), title: "Search", image: UIImage(imageLiteralResourceName: "search")),
            generateNavigationController(with: UIViewController(), title: "Downloads", image: UIImage(imageLiteralResourceName: "downloads"))
        ]
    }

    fileprivate func setupTabBar() {
        tabBar.tintColor = .purple
    }

    // MARK:- Helpers

    fileprivate func generateNavigationController(with rootViewController: UIViewController, title: String, image: UIImage) -> UIViewController {

        let controller = UINavigationController(rootViewController: rootViewController)

        controller.tabBarItem.title = title
        controller.tabBarItem.image = image

        rootViewController.navigationItem.title = title
        navigationController?.navigationBar.prefersLargeTitles = true

        return controller
    }
}

Тесты

import Foundation
import XCTest

@testable import Podcasts

class MainTabBarControllerTests: XCTestCase {

    func testTheInitialViewControllerShouldHaveTitleFoo() {
        let sut = MainTabBarController()

       let _ = sut.viewDidLoad()

        XCTAssertEqual(sut.navigationItem.title, "Favourites")
    }
}

1 Ответ

0 голосов
/ 01 октября 2018

Есть некоторые проблемы с доступом к правильным представлениям в вашем фрагменте кода.Кстати, я написал дополнительный тест для вашего контроллера панели вкладок, надеюсь, это поможет :) Попробуйте пройти тест:

class MainTabBarControllerTests: XCTestCase {

    func testFirstTabTitleIsCorrectAfterInitialSetup() {
        // Given
        let sut = MainTabBarController()

        // When
        sut.viewDidLoad()

        // Then
        let viewController = sut.viewControllers?.first
        let title = viewController?.tabBarItem.title
        XCTAssertEqual(title, "Favourites")
    }

    func testNavigationTitleIsCorrectAfterInitialSetup() {
        // Given
        let sut = MainTabBarController()

        // When
        sut.viewDidLoad()

        // Then
        let viewController = sut.viewControllers?.first as? UINavigationController
        let title = viewController?.viewControllers.first?.navigationItem.title
        XCTAssertEqual(title, "Favourites")
    }
}

Хорошо, что вы уже использовали Given-When-Then, но этобыло бы даже здорово, если бы вы улучшили наименование теста.Существует множество соглашений, например, я предпочитаю что-то вроде test_SubjectUnderTest_doSomething_whenConditionsAreCorrect .

Вот еще один совет.Попробуйте выяснить, как разделить логику между представлением и контроллером представления.Если вы запачкаете руки хотя бы в MVP (Model-View-Presenter), тогда вы поймете, что его тестируемость лучше.

Кстати, вместо такого рода тестов более разумнорассмотрим тесты пользовательского интерфейса .Тесты пользовательского интерфейса в основном полагаются на идентификаторы доступности.Наиболее популярными инструментами для автоматизации тестирования являются Appium или XCUITests / Earlgrey, если вы предпочитаете использовать native.

...