Я пытаюсь выполнить несколько простых Core Data
модульных тестов.
Но из того, что я вижу, создано два постоянных хранилища (оба типа sql), поэтому мои setup(), tearDown()
методы модульного тестирования вызываются дважды, сбрасываяNSManagedObjectContext
, что вызывает некоторые проблемы.
Вот мой код для загрузки магазинов:
func createContainer(storeType: StoreType, completion: @escaping (NSPersistentContainer) -> ()) {
let container = NSPersistentContainer(name: "Gym")
container.loadPersistentStores { description, error in
guard error == nil else {
fatalError("Failed to load store \(error!)")
}
description.type = storeType.type
completion(container)
}
}
А это мой код модульного теста:
import XCTest
import CoreData
@testable import Gym
class GymTests: XCTestCase {
var context: NSManagedObjectContext!
override func setUp() {
super.setUp()
createContainer(storeType: .inMemory) { container in
self.context = container.viewContext
}
}
func testAddingExercise() {
// Given
context.performChanges {
_ = Exercise.insert(into: self.context, name: "Bench Press", groups: Set(["Chest", "Triceps", "Shoulders"]))
_ = Exercise.insert(into: self.context, name: "Squats", groups: Set(["Legs"]))
_ = Exercise.insert(into: self.context, name: "Deadlifts", groups: Set(["Back", "Legs", "Arms"]))
}
// When
let exercises = Exercise.fetch(in: context)
// Then
XCTAssertEqual(exercises.count, 3)
}
override func tearDown() {
context = nil
super.tearDown()
}
}
Во второй раз, когда он запускает мой тест, контекст был сброшен в tearDown()
, поэтому при добавлении упражнений контекст будет нулевым.
Не уверен, как именно это происходит.Почему создается два магазина?