【问题标题】:Swift CoreData UnitTest: How to avoid EXC_BREAKPOINTSwift CoreData UnitTest:如何避免 EXC_BREAKPOINT
【发布时间】:2015-03-28 04:19:01
【问题描述】:

这将是使用 swift 进行 CoreData 单元测试的常见问题。由于 swift 在普通模块和测试模块之间的命名空间差异,会发生 EXC_BREAKPOINT 异常。即使引入了一些解决方案,我仍在努力解决这个问题。

我做了什么,我的问题就在这里。

  1. 使用带有核心数据的单一应用程序模板使用检查选项创建新项目。
  2. 运行单元测试。没有发生错误。
  3. 将 CoreDataSampleTest 目标添加到 Appdelegate.swift。
  4. 将 CoreDataSampleTests.swift 中的 testExample() 更改如下。
func testExample() {
    let appDel: AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate
}
  1. 运行单元测试。发生了 EXC_BREAKPOINT。
  2. 在 AppDelegate.swift 中更改 managedObjectModel() 如下Swift cannot test core data in Xcode tests?
lazy var managedObjectModel: NSManagedObjectModel = {
    // The managed object model for the application. This property is not optional...
    let modelURL = NSBundle.mainBundle().URLForResource("CoreDataSample", withExtension: "momd")!
    let managedObjectModel = NSManagedObjectModel(contentsOfURL: modelURL)!

    // Check if we are running as test or not
    let environment = NSProcessInfo.processInfo().environment as [String : AnyObject]
    let isTest = (environment["XCInjectBundle"] as? String)?.pathExtension == "xctest"

    // Create the module name
    let moduleName = (isTest) ? "CoreDataSampleTests" : "CoreDataSample"

    // Create a new managed object model with updated entity class names
    var newEntities = [] as [NSEntityDescription]
    for (_, entity) in enumerate(managedObjectModel.entities) {
        let newEntity = entity.copy() as NSEntityDescription
        newEntity.managedObjectClassName = "\(moduleName).\(entity.name)"
        newEntities.append(newEntity)
    }
    let newManagedObjectModel = NSManagedObjectModel()
    newManagedObjectModel.entities = newEntities

    return newManagedObjectModel
}()
  1. 运行单元测试。 EXC_BREAKPOINT 再次发生。

我想知道两件事。

  1. 如何避免 EXC_BREAKPOINT 异常。测试方法似乎正常工作,但 EXC_BREAKPOINT 异常会在每个测试方法处临时停止进程。我必须每次都恢复它。运行测试方法非常困难。

  2. 如果我无法避免 EXC_BREAKPOINT,我想在执行单元测试时忽略 EXC_BREAKPOINT 异常。

任何帮助或建议都会对我有所帮助。

谢谢,

仅供参考:

Swift cannot test core data in Xcode tests?.

编辑:

XCode 版本为 6.2

【问题讨论】:

  • 我建议您在创建新应用程序时使用检查选项更好地创建具有核心数据的新应用程序。试一次!!!
  • @NRV 感谢您的回复。我没有提到它,但我使用检查选项创建了带有核心数据的项目。我编辑了我的问题。

标签: ios xcode swift core-data


【解决方案1】:

正如 Wolfgang 所说,我认为 Jesse Squires 解决方案有效(它适用于我),但有几个步骤:

  • 可选:将您的核心数据移动到一个单独的模块中(我使用了一个框架,因为 Xcode 6.2 似乎仍然不喜欢 Swift 静态库) - 这个提示是由 Jessie Squires 提供的,

(这不是必需的,但有助于保持整洁,因为以下步骤涉及公开很多内容,如果您不将其分开,这将在您的整个项目中传播。)

  • 将 @objc(ClassName) 添加到所有 NSManagedObject 类中,
  • 公开所有 NSManagedObject 类及其包含的所有属性,

您最终应该得到如下所示的实体:

import Foundation
import CoreData

@objc(ClassName)
public class ClassName: NSManagedObject {
    @NSManaged public var property: Type        
}
  • 使模型中所有实体的实体类名称成为对该类的简单引用(例如,ClassName 不是 AppName.ClassName)。
  • 将与 Core Data 位于同一模块中且您想要进行单元测试的所有类、方法、属性等公开,
  • 从测试目标中删除所有类(即在“目标成员资格”中为每个类取消选中测试目标),但将数据模型保留在测试目标中,
  • 将您的应用导入您的测试类(例如,将 import AppName 添加到测试类源)。

在 SO 答案 here 中有另一种方法也有效。

编辑 1:添加了关于替代的注释。

编辑 2:传递了将核心数据移动到单独模块中的提示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-04
    • 2012-02-24
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多