Swift Xcode 6 在测试时提供 SIGABRT

Posted

技术标签:

【中文标题】Swift Xcode 6 在测试时提供 SIGABRT【英文标题】:Swift Xcode 6 gives SIGABRT when Testing 【发布时间】:2015-04-12 03:41:46 【问题描述】:

我最近更新到了最新版本的 Xcode (6.3),现在无法运行我们之前的测试。

它会抛出一个带有以下信息的 SIGABRT:

无法将“MyApplication.MyPSClass”(0x109d7f410) 类型的值转换为“MyApplicationTests.MyPSClass”(0x1197ddec0)。

MyApplicationTests 是测试目标,MyApplication 是普通应用目标。

MyApplication 使用 Parse 作为我们的后端。这个错误是否可能是子类化功能的结果?

MyClass 子类 PFObject 和 PFSubclassing 如 Parse 的子类化文档中所指定:

class MyPSClass : PFObject, PFSubclassing  ... 

显示“线程 1:SIGABRT”的行是:

let myPSInstance = MyPSClass.query().getObjectWithId("ParseObjectIDString") as! MyPSClass

包含这一行的测试类文件如下所示:

import UIKit
import XCTest

class MyClassTests: XCTestCase 

    override func setUp() 
        super.setUp()
        //...
    

    func testInit() 
        let myPSInstance = MyPSClass.query().getObjectWithId("ParseObjectIDString") as! MyPSClass
        //...    
    

    override func tearDown() 
        super.tearDown()
    


为什么会发生这种情况,我该如何解决?提前致谢!

【问题讨论】:

【参考方案1】:

发生了什么是在这一行:

let myPSInstance = MyPSClass.query().getObjectWithId("ParseObjectIDString") as! MyPSClass

您正在将 MyPSClass 转换为 MyApplicationTests.MyPSClass。你看不出来,因为 swift 使用隐式命名空间(它隐藏了 MyApplicationTests 命名空间)。您可以使用:

let myPSInstance = MyPSClass.query().getObjectWithId("ParseObjectIDString") as! MyApplication.MyPSClass

【讨论】:

我已经尝试过了,但是,我收到一条错误消息,提示“使用未声明的类型 'MyApplication'”。 MyApplication 不是正确的命名空间,还是无法访问?我也尝试添加“import MyApplication”,但无济于事。这给出了错误“模块'MyApplication'中没有类型名称'MyPSClass'”。 不是,但将其更改为 public class MyPSClass : PFObject, PFSubclassing ... 并没有帮助。它仍然尝试将其转换为 MyApplicationTests.MyPSClass。 调用时仍需要使用 MyApplication.MyPSClass,既然它现在是公开的,它应该可以工作。 谢谢!那行得通!我不得不在顶部添加import MyApplication,并且将我想要访问的所有方法和变量都公开,这似乎太过分了。这是否意味着类和方法在其各自的目标中被认为是公共的,但在我的测试目标中被认为是私有的? 是的,可以从类本身访问私有方法。您必须将内容公开,以便您的测试目标可以访问它们。万岁,玩得开心!

以上是关于Swift Xcode 6 在测试时提供 SIGABRT的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 6.4 Swift 单元测试无法编译:“GPUImage.h 未找到”“导入桥接头失败”

在 Xcode 7.0.1 中进行 UI 测试时,是不是可以使用 Swift 滚动到 Element()?

(Xcode 6 beta / Swift) performSegueWithIdentifier 在 segue 之前有延迟

Xcode 6 - SWIFT - 访问数组时出错

当我在 Xcode 6 beta 中尝试 Swift Playground 时出错

UIPopoverController、Xcode 6、IOS 8 使用 Swift