我目前正在尝试了解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")
}
}
答案 0 :(得分:0)
在代码段中访问适当的视图存在一些问题。顺便说一句,我为您的标签栏控制器编写了一个额外的测试,希望它会有所帮助:)尝试通过测试:
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")
}
}
您已经使用了“当下就给定”是一件好事,但是如果您改进测试的命名,那就更好了。有很多约定,例如,我更喜欢 test_SubjectUnderTest_doSomething_whenConditionsAreCorrect 之类的东西。
这是另一个提示。尝试弄清楚如何区分视图和视图控制器之间的逻辑。如果您不习惯使用MVP(Model-View-Presenter),那么您会发现它的可测试性更好。
顺便说一句,考虑使用 UI测试代替这种测试更为合理。 UI测试主要依赖于可访问性ID。如果您希望使用本机,则最受欢迎的测试自动化工具是Appium或XCUITests / Earlgrey。