使用Core Data进行Swift 4单元测试

3
我有一个iOS项目,在模拟器上运行良好,但是当我从测试包中进行工作时,似乎无法很好地链接到Core Data资源。
我已经在测试类的设置函数中从内存中创建了NSManagedObjectContext。然而,当我尝试运行程序时,测试函数失败,并且控制台输出了错误信息。
"An NSManagedObject of class 'Projectname.Deck' must have a valid NSEntityDescription."

有什么我忽略的东西吗?我希望能够在开发过程中为我的应用程序数据结构编写单元测试。

谢谢!

编辑

测试类的相关部分:

class ProjectNameTests: XCTestCase {

var testDeck: Deck? = nil

    func setUpInMemoryManagedObjectContext() -> NSManagedObjectContext {
    let managedObjectModel = NSManagedObjectModel.mergedModel(from: [Bundle.main])!

    let persistentStoreCoordinator = NSPersistentStoreCoordinator(managedObjectModel: managedObjectModel)

    do {
        try persistentStoreCoordinator.addPersistentStore(ofType: NSInMemoryStoreType, configurationName: nil, at: nil, options: nil)
    } catch {
        print("Adding in-memory persistent store failed")
    }

    let managedObjectContext = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
    managedObjectContext.persistentStoreCoordinator = persistentStoreCoordinator

    return managedObjectContext
}//setUpInMemoryManagedObjectContext

override func setUp() {
    super.setUp()

    self.context = setUpInMemoryManagedObjectContext()
    testDeck = Deck(context: context)
    testDeck!.name = "Test Deck"
}//setUp
}//ProjectNameTests

展示你所拥有的类和测试代码,让我们看看并提供帮助。这里提供的信息不足以给出答案。 - Scriptable
1个回答

1

更新: 经过一番调查研究,我发现我的问题与从类本身而不是当前上下文中提取NSEntityDescription有关。 我在我的Deck类中添加了以下方法(并将对其他NSManagedObject子类执行相同操作):

public static func entityDescription(context: NSManagedObjectContext)->NSEntityDescription{
    return NSEntityDescription.entity(forEntityName: String(describing: self), in: context)!
}//entityDescription

我随后更改了测试用例中的初始化调用如下所示:
let deckEntity: NSEntityDescription = Deck.entityDescription(context: context)
testDeck = Deck(entity: deckEntity, insertInto: context)

通过使用当前的NSManagedObjectContext中提取的NSEntityDescription来初始化对象,这样可以使一切更加顺畅。

感谢Swift,Core Data和单元测试指引我走上正确的道路。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接