2016-07-29 97 views
0

在下面的代碼中,如果我註釋掉分配給視圖屬性的變量,則測試失敗。我指的是:爲什麼視圖屬性必須分配給變量?

_=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) 
    } 


} 

回答

1

視圖控制器不加載其視圖首次view屬性被訪問,直到,所以分配view給一個變量將其加載。

如果沒有加載視圖,那麼沒有任何插口將被連接,因此sut.tableView將是nil,您的測試將失敗。

1

第一次訪問控制器時,控制器的view會延遲加載(自動調用UIViewController.loadView,然後UIViewController.viewDidLoad)。

如果您訪問此屬性並且它的值當前爲零,則視圖控制器將自動調用loadView方法並返回結果視圖。

因爲訪問此屬性可以使視圖自動加載,所以可以使用isViewLoaded方法來確定視圖當前是否在內存中。與此屬性不同,如果視圖當前不在內存中,isViewLoaded屬性不會強制加載視圖。

(從UIViewController.view

載入控制器視圖意味着它的所有子視圖被加載並連接到插座,因此如果不加載該視圖中,tableView出口將nil

分配給_是否只是爲了使編譯器對未使用的結果警告聲明爲無聲。在iOS 9和更高版本中,您可以使用sut.loadViewIfNeeded()

相關問題