How to subclass a UIViewController in Swift?

I am trying to test a subclass UITableViewControllerin swift with a storyboard. I can get a link to the view controller and register it, but I cannot graft it to the class that I am trying to test, so I cannot access methods, properties, etc.

What is the correct way to capture an instance of my class?

Testing scenario:

import XCTest
import UIKit    
class GameListControllerTest: XCTestCase {
    var storyboard = UIStoryboard(name: "Main", bundle: nil)
    var _sut: AnyObject?
    var sut: AnyObject {
        if(_sut?) {
            return _sut!
        }
        _sut = storyboard.instantiateViewControllerWithIdentifier("GameListController")
        return _sut!
    }
    override func setUp() {
        super.setUp()
        println()
        println("=================================")
        println("sut  \(sut)")
        println("view  \(sut.view)")
        println("=================================")

    }
    func testInstance() {
        var vc1 = sut as UITableViewController
        var vc2 = sut as? GameListController
        println()
        println("=================================")
        println("VC1  \(vc1)")
        println("VC2  \(vc2)")
        println("=================================")
    }
}

Conclusion:

XCTestOutputBarrierTest Suite '_TtC15mytabletopTests22GameListControllerTest' started at 2014-06-16 06:13:30 +0000
XCTestOutputBarrierTest Case '-[_TtC15mytabletopTests22GameListControllerTest testInstance]' started.
XCTestOutputBarrier
=================================
sut  <_TtC10mytabletop18GameListController: 0xb338d50>
view  <UITableView: 0xc033800; frame = (0 0; 320 568); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0xb344960>; layer = <CALayer: 0xb33c7d0>; contentOffset: {0, 0}; contentSize: {480, 0}>
=================================

=================================
VC1  <_TtC10mytabletop18GameListController: 0xb338d50>
VC2  nil
=================================
Test Case '-[_TtC15mytabletopTests22GameListControllerTest testInstance]' passed (0.007 seconds).
XCTestOutputBarrierTest Suite '_TtC15mytabletopTests22GameListControllerTest' passed at 2014-06-16 06:13:30 +0000.
     Executed 1 test, with 0 failures (0 unexpected) in 0.007 (0.010) seconds

If I try to force typecast ( sut as GameListController), I get an exception at runtime.

+4
source share
1 answer

This is what happens. It took me days to understand, but my problem was how my classes are exported to targets:

File Inspector Target Membership Incorrect vs.  Correct

: . , :

Test Case '-[_TtC15mytabletopTests22GameListControllerTest testInstance]'

testInstance mytabletopTests. , Storyboard:

sut  <_TtC10mytabletop18GameListController: 0xb338d50>

, , mytabletop. , GameListController. GameListController, , .

, :

import XCTest
import UIKit
import mytabletop // LINE ADDED

class GameListControllerTest: XCTestCase {

GameListController, , , , , , . :

import XCTest
import UIKit
import mytabletop

class GameListControllerTest: XCTestCase {
    let sut: GameListController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("GameListController") as GameListController

    override func setUp() {
        super.setUp()
        UIApplication.sharedApplication().keyWindow.rootViewController = sut
        XCTAssertNotNil(sut.view)
    }

    func testInstance() {
        XCTAssertNotNil(sut)
        XCTAssertNotNil(sut.tableView) // UITableViewController property
        XCTAssertNotNil(sut.store) // instance property
        XCTAssertNotNil(sut.someButton) // outlet
    }
}

(, as GameListController) . , , rootViewController , setUp . myCustomOutlet .

+10

Source: https://habr.com/ru/post/1544703/


All Articles