在以下代码中,如果我注释掉分配给view属性的变量,则测试将失败。我指的是:
_=sut.view
然而,当取消注释该行代码时,测试通过。为什么它甚至是必要的?
这是完整的单元测试:
import XCTest
@testable import ToDo
class ItemListViewControllerTests: XCTestCase {
var sut:ItemListViewController!
override func setUp() {
super.setUp()
// Put setup code here. This method is called before the invocation of each test method in the class.
let storyboard = UIStoryboard(name: "Main", bundle: nil)
sut = storyboard.instantiateViewControllerWithIdentifier("ItemListViewController") as! ItemListViewController
_=sut.view
}
override func tearDown() {
// Put teardown code here. This method is called after the invocation of each test method in the class.
super.tearDown()
}
func test_TableViewIsNotNilAfterViewDidLoad(){
XCTAssertNotNil(sut.tableView.dataSource)
XCTAssertTrue(sut.tableView.dataSource is ItemListDataProvider)
}
func testViewDidLoad_ShouldSetTableViewDelegate(){
XCTAssertNotNil(sut.tableView.delegate)
XCTAssertTrue(sut.tableView.delegate is ItemListDataProvider)
}
func testViewDidLoad_ShouldSetDelegateAndDataSourceToSameObject(){
XCTAssertEqual(sut.tableView.dataSource as? ItemListDataProvider, sut.tableView.delegate as? ItemListDataProvider)
}
}
答案 0 :(得分:1)
视图控制器在第一次访问view
属性之前不会加载视图,因此将view
分配给变量将加载它。
如果未加载视图,则不会连接任何插座,因此sut.tableView
将nil
并且您的测试将失败。
答案 1 :(得分:1)
首次访问时,控制器的view
会被懒散加载(自动调用UIViewController.loadView
然后调用UIViewController.viewDidLoad
)。
如果访问此属性且其值当前为nil,则视图控制器会自动调用loadView方法并返回结果视图。
由于访问此属性可能导致视图自动加载,因此可以使用isViewLoaded方法确定视图当前是否在内存中。与此属性不同,如果视图当前不在内存中,则isViewLoaded属性不会强制加载视图。
加载控制器视图意味着其所有子视图都已加载并连接到插座,因此如果您不加载视图,tableView
插座将为nil
。
分配给_
只是为了使编译器对未使用的结果发出警告。在iOS 9及更高版本中,您可以使用sut.loadViewIfNeeded()