【问题标题】:XCTestCase for CoreData fails with "could not locate the entity for myappTests.Example"CoreData 的 XCTestCase 失败并显示“无法找到 myappTests.Example 的实体”
【发布时间】:2018-01-16 18:25:36
【问题描述】:

我可以在 XCTestCase 测试中创建一个这样的实体就好了:

let entity = NSEntityDescription.insertNewObject(
                   forEntityName: String(describing: Example.self), 
                   into: inMemoryManagedObjectContext)

但如果我这样做:

let item = Example(context: inMemoryManagedObjectContext)

测试将失败并...

failed: caught "NSInvalidArgumentException", "An NSManagedObject of
class 'myappTests.Example' must have a valid NSEntityDescription."

如果我不能按照通常的方式创建 Core Data 对象,我应该如何测试它们?

【问题讨论】:

  • 您是否将类文件添加到测试目标?或者您是否在测试类中使用 @testable import MyAppTarget 导入您的 MyAppTarget?
  • 我很确定我导入了我需要的所有东西,因为我可以创建对象并使用 NSEntityDescription.insertNewObject 或相关函数的旧方式很好地使用它们。
  • 有区别,你能检查一下你的示例类文件是添加到应用目标还是测试目标吗?
  • 是的。如果没有,那么我的示例将无法编译
  • 这就是问题所在,你永远不应该将你的类文件添加到测试目标中,而是将你的应用目标作为一个模块导入你的测试类中。

标签: ios swift core-data xctest


【解决方案1】:

我也有这个问题 :) 我猜,问题在于CoreData 还不知道这些实体。 所以, 我能够对其进行测试的解决方案是在测试时拥有一个 NSPersistantContainer 实例。

var persistentContainer: NSPersistentContainer!
    override func setUp() {
        super.setUp()
        guard let model = CoreDataUtilities.model(withName: "ModelName") else {
            return XCTFail("Model should load")
        }
        storeFolder = FileManager.default.temporaryDirectory.appendingPathComponent("storeDirectory", isDirectory: true)
        let storeURL = storeFolder.appendingPathComponent("store.db")
        let storeInfo = NSPersistentStoreDescription(url: storeURL)
        storeInfo.type = NSSQLiteStoreType
        persistentContainer = NSPersistentContainer(name: "ModelName", managedObjectModel: model)
        persistentContainer.persistentStoreDescriptions = [storeInfo]
        return
    }

现在您可以以经典方式使用 CoreData。

【讨论】:

  • 不,CoreData 非常熟悉实体,因为我可以使用 NSEntityDescription.insertNewObject 来创建它们
  • 如果 CoreData 知道实体,则不会出现此错误,请尝试一下。
  • 我认为你的代码没有错,但这不是我想要的
猜你喜欢
  • 2013-03-19
  • 2011-04-17
  • 1970-01-01
  • 2021-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-21
相关资源
最近更新 更多