为什么必须将视图属性分配给变量?

时间:2016-07-29 17:59:34

标签: ios swift xcode xctest

在以下代码中,如果我注释掉分配给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)
    }


}

2 个答案:

答案 0 :(得分:1)

视图控制器在第一次访问view属性之前不会加载视图,因此将view分配给变量将加载它。

如果未加载视图,则不会连接任何插座,因此sut.tableViewnil并且您的测试将失败。

答案 1 :(得分:1)

首次访问时,控制器的view会被懒散加载(自动调用UIViewController.loadView然后调用UIViewController.viewDidLoad)。

  

如果访问此属性且其值当前为nil,则视图控制器会自动调用loadView方法并返回结果视图。

     

由于访问此属性可能导致视图自动加载,因此可以使用isViewLoaded方法确定视图当前是否在内存中。与此属性不同,如果视图当前不在内存中,则isViewLoaded属性不会强制加载视图。

(来自UIViewController.view

加载控制器视图意味着其所有子视图都已加载并连接到插座,因此如果您不加载视图,tableView插座将为nil

分配给_只是为了使编译器对未使用的结果发出警告。在iOS 9及更高版本中,您可以使用sut.loadViewIfNeeded()

实现相同的目标
相关问题