Swift cannot test core data in Xcode tests?

前端 未结 5 622
失恋的感觉
失恋的感觉 2021-02-02 12:42

I am working on a iOS project that uses core data. I am using swift. The Core Data stack is setup right and all seems to be fine. I have created a class for an entity (NSManage

5条回答
  •  鱼传尺愫
    2021-02-02 13:37

    I also faced similar issue when I tried to write unit test cases for a sample app (MedicationSchedulerSwift3.0) written in Swift 3.0, apart from implementing solution provided by johnford I created a category on XCTestCase to setup an NSManagedObjectContext with in-memory store by using below code:

    //  XCTestCase+CoreDataHelper.swift
    
    import CoreData
    import XCTest
    @testable import Medication
    
    extension XCTestCase {
        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
        }
    }
    

    And used it like this:

    //  NurseTests.swift
    
    import XCTest
    import CoreData
    @testable import Medication
    
    class NurseTests: XCTestCase {
        var managedObjectContext: NSManagedObjectContext?
    
        //MARK: Overriden methods
        override func setUp() {
            super.setUp()
            // Put setup code here. This method is called before the invocation of each test method in the class.
            if managedObjectContext == nil {
                managedObjectContext = setUpInMemoryManagedObjectContext()
            }
        }
    
    //MARK:- Testing functions defined in Nurse.swift
        // testing : class func addNurse(withEmail email: String, password: String, inManagedObjectContext managedObjectContext: NSManagedObjectContext) -> NSError?
        func testAddNurse() {
            let nurseEmail = "clara@gmail.com"
            let nursePassword = "clara"
    
            let error = Nurse.addNurse(withEmail: nurseEmail, password: nursePassword, inManagedObjectContext: managedObjectContext!)
            XCTAssertNil(error, "There should not be any error while adding a nurse")
        }
    }
    

    In case if someone needs more examples they can look at unit test cases over here - MedicationTests

提交回复
热议问题