当 运行 一起但不是一次一个时,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
文件的文件检查器中,您应该只选择一个目标成员资格。
如果您在应用程序 和 测试中需要此数据模型,请选择应用程序目标,或者如果您仅在测试代码中使用它,请选择测试的目标。
我想弄清楚为什么当两个单元测试一起 运行 时会崩溃。
单独运行时,一次测试一个,一切正常。但是当我尝试 运行 整个 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
文件的文件检查器中,您应该只选择一个目标成员资格。
如果您在应用程序 和 测试中需要此数据模型,请选择应用程序目标,或者如果您仅在测试代码中使用它,请选择测试的目标。