当 运行 一起但不是一次一个时,CoreData XCTest 测试失败

CoreData XCTest tests fail when run together but not one at a time

我想弄清楚为什么当两个单元测试一起 运行 时会崩溃。

单独运行时,一次测试一个,一切正常。但是当我尝试 运行 整个 class 的测试时,第二个失败并显示“用于打开商店的模型配置与用于创建商店的模型配置不兼容。”。 =13=]

这是一个 link 到 GitHub 的回购协议,其中包含一个具有可重现问题的极其简单的项目:https://github.com/MatthewWaller/CoreDataTestingIssueNonBeta

此外,我的代码的相关部分如下。要使其工作,请添加带有“Note”实体的 xcdatamodel 文件,该实体具有字符串“title”属性,并将其添加到测试目标。

import XCTest
import CoreData
@testable import CoreDataTestingIssue

class CoreDataTestingIssueTests: XCTestCase {
    private var context: NSManagedObjectContext?
    
    override func setUpWithError() throws {
        // Put setup code here. This method is called before the invocation of each test method in the class.
        self.context = NSManagedObjectContext.contextForTests()
    }
    
    override func tearDownWithError() throws {
        // Put teardown code here. This method is called after the invocation of each test method in the class.
    }
    
    func testExampleOne() throws {
        guard let context = context else {
            return
        }
        let note = Note(context: context)
        note.title = "Hello"
        try! context.save()
    }
    
    func testExampleTwo() throws {
        guard let context = context else {
            return
        }
        let note = Note(context: context)
        note.title = "There"
        try! context.save()
    }
}

extension NSManagedObjectContext {
    
    class func contextForTests() -> NSManagedObjectContext {
        // Get the model
        let model = NSManagedObjectModel.mergedModel(from: Bundle.allBundles)!
        
        // Create and configure the coordinator
        let coordinator = NSPersistentStoreCoordinator(managedObjectModel: model)
        try! coordinator.addPersistentStore(ofType: NSInMemoryStoreType, configurationName: nil, at: nil, options: nil)
        
        // Setup the context
        let context = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
        context.persistentStoreCoordinator = coordinator
        return context
    }
}

我已经重现了失败。问题是您的代码实现了此 Note class 两次。

.xcdatamodeld 文件的文件检查器中,您应该只选择一个目标成员资格。

如果您在应用程序 测试中需要此数据模型,请选择应用程序目标,或者如果您仅在测试代码中使用它,请选择测试的目标。