gpt4 book ai didi

ios - Swift 核心数据单元测试 : How to avoid EXC_BREAKPOINT

转载 作者:搜寻专家 更新时间:2023-11-01 06:09:06 27 4
gpt4 key购买 nike

这将是使用 swift 的 CoreData 单元测试中的常见问题。 EXC_BREAKPOINT 异常是由于正常模块和测试模块之间的 swift namespace 差异而发生的。尽管介绍了一些解决方案,但我仍在努力解决这个问题。

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

  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

最佳答案

正如 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:传递了将核心数据移至单独模块的提示。

关于ios - Swift 核心数据单元测试 : How to avoid EXC_BREAKPOINT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29313645/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com