Swift CoreData UnitTest:如何避免EXC_BREAKPOINT

这在使用Swift的CoreDataunit testing中将是常见的问题。 由于正常模块和testing模块之间的swift名称空间不同,EXC_BREAKPOINTexception发生。 即使引入了一些解决scheme,我仍然在努力解决这个问题。

我所做的和我的问题在这里。

  1. 使用检查选项使用具有核心数据的单个应用程序模板创build新项目。
  2. 运行unit testing。 没有发生错误。
  3. 将CoreDataSampleTest目标添加到Appdelegate.swift。
  4. 在CoreDataSampleTests.swift中更改testExample()如下。
func testExample() { let appDel: AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate } 
  1. 运行unit testing。 发生了EXC_BREAK点。
  2. 更改AppDelegate.swift中的managedObjectModel()如下Swift无法在Xcodetesting中testing核心数据? 。
 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. 运行unit testing。 EXC_BREAKPOINT再次发生。

我想知道的是两件事情。

  1. 如何避免EXC_BREAKPOINTexception。 testing方法似乎正常工作,但EXC_BREAKPOINTexception临时停止每个testing方法的过程。 我必须每次恢复。 运行testing方法非常困难。

  2. 如果我无法避免EXC_BREAKPOINT,则在执行unit testing时,我想忽略EXC_BREAKPOINTexception。

任何帮助或build议将有助于我。

谢谢,

供参考:

Swift无法在Xcodetesting中testing核心数据? 。

编辑:

XCode版本是6.2

正如Wolfgang所说,我认为Jesse Squires的解决scheme是有效的(但对我来说)却有几个步骤:

  • 可选:将您的核心数据移动到一个单独的模块(我使用框架作为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相同的模块中的所有类,方法,属性等,并且要unit testing,
  • 从testing目标中移除所有的类(即,在每个testing目标的“目标成员”中取消testing目标),但将数据模型留在testing目标中,
  • 将您的应用程序导入您的testing类(例如添加导入AppName到testing类源)。

在这里的SO答案中有一个替代方法,也是有效的。

编辑1:添加备注关于替代。

编辑2:通过技巧移动核心数据到一个单独的模块。

你可以findJesse发布的解决scheme: http : //www.jessesquires.com/swift-coredata-and-testing/