swift – 无法从XCTest中的UIStoryboard转换自定义UIViewControl
发布时间:2020-12-14 05:36:56 所属栏目:百科 来源:网络整理
导读:在 Swift,Xcode6-Beta5,我试图单元测试我的“ViewController”,而不是一个非常有创意的名字. 从其他响应中,我想我没有正确配置我的“测试”目标. 失败的测试代码: func testItShouldLoadFromStoryboard() { var storyBoard: UIStoryboard? var anyVC: AnyOb
在
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编辑器中删除连接,或者我发现打破事情的许多其他方式… 编辑—- 使用如下所示的代码替换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 }
我想出了一个比公开的更好的解决方案.您实际上只需要使用来自测试包的故事板,而不是使用nil(强制它来自主要目标的捆绑包).如果有任何人有兴趣再阅读一点,我更加深入
here.
var storyboard: UIStoryboard = UIStoryboard(name: "Main",bundle: NSBundle(forClass: self.dynamicType)) vc = storyboard.instantiateViewControllerWithIdentifier("LoginVC") as LoginViewController vc.loadView() (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- React Native导航器之react-navigation使用
- ruby-on-rails – JBuilder从视图调用to_builder
- xml – 如何通过股票代码获取有关公司财务状况,资产负债表,
- c# – 预乘alpha合成
- 删除XML中标记之间不需要的空格(Javascript)
- Cocoa利用TexturePacker创建的纹理图集实现角色的帧动画
- 自译: 如何使用服务器端渲染构建快速加载的React apps
- oracle – if(select count(column)from table)> 0 then
- 使用CMarkup创建及解析XML文档
- 关于logback.xml加载外部配置文件问题