在
Swift,Xcode6-Beta5,我试图单元测试我的“ViewController”,而不是一个非常有创意的名字.
从其他响应中,我想我没有正确配置我的“测试”目标.
失败的测试代码:
func testItShouldLoadFromStoryboard() { var storyBoard: UIStoryboard? var anyVC: AnyObject? var viewController: ViewController? var uiViewController: UIViewController? storyBoard = UIStoryboard(name:"Main",bundle: nil) XCTAssert(storyBoard != nil,"Test Not Configured Properly") anyVC = storyBoard?.instantiateInitialViewController() viewController = anyVC as? ViewController // Failing Assertion XCTAssert(viewController != nil,"Test Not Configured Properly") uiViewController = anyVC as? UIViewController XCTAssert(uiViewController != nil,"Test Not Configured Properly") }
我可以强制演员如下:
anyVC = storyBoard?.instantiateInitialViewController() viewController = (anyVC != nil) ? (anyVC as ViewController) : nil
但这导致以下崩溃:
libswiftCore.dylib`swift_dynamicCastClassUnconditional: 0x10724f5a0: pushq %rbp 0x10724f5a1: movq %rsp,%rbp 0x10724f5a4: pushq %r14 0x10724f5a6: pushq %rbx 0x10724f5a7: movq %rsi,%rbx 0x10724f5aa: movq %rdi,%r14 0x10724f5ad: testq %r14,%r14 0x10724f5b0: je 0x10724f5de ; swift_dynamicCastClassUnconditional + 62 0x10724f5b2: movabsq $-0x7fffffffffffffff,%rax 0x10724f5bc: andq %r14,%rax 0x10724f5bf: jne 0x10724f5de ; swift_dynamicCastClassUnconditional + 62 0x10724f5c1: movq %r14,%rdi 0x10724f5c4: callq 0x107279a6e ; symbol stub for: object_getClass 0x10724f5c9: nopl (%rax) 0x10724f5d0: cmpq %rbx,%rax 0x10724f5d3: je 0x10724f5ed ; swift_dynamicCastClassUnconditional + 77 0x10724f5d5: movq 0x8(%rax),%rax 0x10724f5d9: testq %rax,%rax 0x10724f5dc: jne 0x10724f5d0 ; swift_dynamicCastClassUnconditional + 48 0x10724f5de: leaq 0x3364d(%rip),%rax ; "Swift dynamic cast Failed" 0x10724f5e5: movq %rax,0xa456c(%rip) ; gCRAnnotations + 8 0x10724f5ec: int3 0x10724f5ed: movq %r14,%rax 0x10724f5f0: popq %rbx 0x10724f5f1: popq %r14 0x10724f5f3: popq %rbp 0x10724f5f4: retq 0x10724f5f5: nopw %cs:(%rax,%rax)
我也已经直接成功地实例化了ViewController,但是不做IBOutlet处理,这是我测试的目的之一,确保我不会通过重命名来删除链接,在Storyboard编辑器中删除连接,或者我发现打破事情的许多其他方式…
编辑—-
我开始了一个新的项目,选择了iOS应用程序 – >单一查看应用程序模板.
使用如下所示的代码替换testExample,将ViewController添加到测试目标.类似的结果.此模板具有ViewController类型的单个视图控制器,故事板中没有其他任何内容.
func testExample() { var storyBoard: UIStoryboard? var anyVC: AnyObject? var viewController: ViewController? storyBoard = UIStoryboard(name:"Main",bundle: nil) XCTAssert(storyBoard != nil,"Test Not Configured Properly") anyVC = storyBoard?.instantiateInitialViewController() viewController = anyVC as? ViewController XCTAssert(viewController != nil,"Test Not Configured Properly") // This is an example of a functional test case. XCTAssert(true,"Pass") }
在anyVC的值之后的断点处设置以下lldb输出:
(lldb) po anyVC (instance_type = Builtin.RawPointer = 0x00007fe22c92a290 -> 0x000000010e20bd80 (void *)0x000000010e20bea0: OBJC_MetaCLASS_$__TtC22TestingViewControllers14ViewController) { instance_type = 0x00007fe22c92a290 -> 0x000000010e20bd80 (void *)0x000000010e20bea0: OBJC_MetaCLASS_$__TtC22TestingViewControllers14ViewController }