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 之前有延迟