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