UITabBarController 中的测试方法正确设置标题

Testing method in UITabBarController sets title correctly

我目前正在尝试了解 Swift 4 中的单元测试。 我有一个 class,有一个方法可以设置我的视图控制器。

我想确保此方法正确设置 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")
    }
}

在您的代码段中访问正确的视图存在一些问题。顺便说一句,我为你的标签栏控制器写了一个额外的测试,希望它会有所帮助:)试试这个来通过测试:

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),那么你会发现它的可测试性更好。

顺便说一句,考虑 UI 测试 比这种测试更合理。 UI 测试主要依赖辅助功能 ID。最流行的测试自动化工具是 Appium 或 XCUITests/Earlgrey 如果您更喜欢使用原生工具。