Ios 如何在Swift中键入子类UIViewController?

Ios 如何在Swift中键入子类UIViewController?,ios,testng,swift,Ios,Testng,Swift,我正在尝试在swift with storyboard中测试UITableViewController的一个子类。我能够获取对视图控制器的引用并记录它,但我无法将其类型转换到我尝试测试的类,因此我无法访问方法、属性等 获取类实例的正确方法是什么 测试场景: 输出: xctestoutputbriertest套件“\u ttc15mytablettoptests22gamelistcontrollertest”于2014-06-16 06:13:30+0000开始 XctTestOutputBar

我正在尝试在swift with storyboard中测试
UITableViewController
的一个子类。我能够获取对视图控制器的引用并记录它,但我无法将其类型转换到我尝试测试的类,因此我无法访问方法、属性等

获取类实例的正确方法是什么

测试场景: 输出:
xctestoutputbriertest套件“\u ttc15mytablettoptests22gamelistcontrollertest”于2014-06-16 06:13:30+0000开始
XctTestOutputBarrierTest案例“-[[u TtC15mytabletopTests22GameListControllerTest testInstance]”已启动。
XCTestOutputBarrier
=================================
苏特
看法
=================================
=================================
VC1
VC2零
=================================
测试用例“-[[u ttc15myTabletopTests22gameListControllerTestTestTestTestInstance]”通过(0.007秒)。
XctTestOutputBarrierTest套件“\u TtC15mytabletopTests22GameListControllerTest”于2014-06-16 06:13:30+0000通过。
执行1次测试,在0.007(0.010)秒内0次失败(0次意外)

如果我尝试强制类型转换(
sut as GameListController
),我会得到一个运行时异常。

下面是发生的情况。我花了好几天的时间才弄明白,但我的问题是如何将我的类导出到目标:

这导致了我的类的两个二进制副本,一个在应用程序目标中,另一个在测试目标中。如果我们更加关注日志,我们可能会注意到:

Test Case '-[_TtC15mytabletopTests22GameListControllerTest testInstance]'
上面是测试方法
testInstance
,它是
mytabletopTests
执行上下文的一部分。现在让我们看一下从情节提要中提取的实例:

sut  <_TtC10mytabletop18GameListController: 0xb338d50>
现在,测试唯一可以访问的
GameListController
就是故事板实例化的那个,我终于能够键入cast了。以下是新的测试用例:

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
    }
}

现在我能够在实例初始化期间正确地进行类型转换(滚动查看GameListController的
)。为了强制正确绑定所有插座,并根据正在运行测试的设备呈现子视图,我们可以将视图控制器设置为应用程序的
rootViewController
,并从中提取视图,如上面的
设置
功能所示。甚至
myCustomOutlet
现在也能正常工作。

它说变量的类型是
TtC10mytabletop18GameListController
,而不是GameListController。前线的那些废话对你有什么意义吗?你的项目中有它吗?在我看来,它更像是一个实例名,而不是一个类。对我来说是这样的:
TtC10+name\u我的应用程序+18+identifier\u在故事板上
。这是你的类的损坏名称。通过在模块名称和一些长度信息(10和18)前面加上前缀,模块中的类名会被破坏
sut  <_TtC10mytabletop18GameListController: 0xb338d50>
import XCTest
import UIKit
import mytabletop // LINE ADDED

class GameListControllerTest: XCTestCase {
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
    }
}