2016-07-29 14 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.tableViewnilになり、テストは失敗します。

1

コントローラーのviewは、最初にアクセスするときに遅くロードされます(自動的にUIViewController.loadViewを呼び出してからUIViewController.viewDidLoadを呼び出します)。

このプロパティにアクセスし、その値が現在nilの場合、ビューコントローラは自動的にloadViewメソッドを呼び出し、結果のビューを返します。

このプロパティにアクセスすると、ビューが自動的にロードされるため、isViewLoadedメソッドを使用してビューが現在メモリにあるかどうかを判断できます。このプロパティとは異なり、isViewLoadedプロパティは、現在メモリに格納されていない場合は、ビューのロードを強制しません。コントローラビューをロード

UIViewController.viewから)

は、ビューをロードしない場合、したがって、tableView出口nilなり、そのすべてのサブビューがロードされ、コンセントに接続されていることを意味します。

_に割り当てると、使用されていない結果についての警告が表示されなくなります。 iOS 9以降では、同じことを達成するにはsut.loadViewIfNeeded()

関連する問題