Swift 单元测试时托管对象上下文nil restkit

Swift 单元测试时托管对象上下文nil restkit,swift,unit-testing,restkit,cocoapods,nsmanagedobjectcontext,Swift,Unit Testing,Restkit,Cocoapods,Nsmanagedobjectcontext,我正在使用与cocoapods集成的restkit(0.24.1)为我的应用程序开发单元测试: pod "RestKit/Testing", "~> 0.24.1" pod "RestKit", "~> 0.24.1" 我收到一条错误消息,指出managedObjectContext为零。我不同意,因为我已经有很多使用相同对象上下文的单元测试,它们似乎都能工作…:/ Restkit设置: lazy var persistentStoreCoordinator: RKManagedO

我正在使用与cocoapods集成的restkit(0.24.1)为我的应用程序开发单元测试:

pod "RestKit/Testing", "~> 0.24.1"
pod "RestKit", "~> 0.24.1"
我收到一条错误消息,指出managedObjectContext为零。我不同意,因为我已经有很多使用相同对象上下文的单元测试,它们似乎都能工作…:/

Restkit设置:

lazy var persistentStoreCoordinator: RKManagedObjectStore? = {
    var coordinator = RKManagedObjectStore(managedObjectModel: self.managedObjectModel)
    self.objectManager!.managedObjectStore = coordinator

    coordinator.createPersistentStoreCoordinator()

    var storePath: NSString = RKApplicationDataDirectory().stringByAppendingPathComponent(self.storeFilename)

    var e: NSError?
    coordinator.addSQLitePersistentStoreAtPath(storePath as String, fromSeedDatabaseAtPath: nil, withConfiguration: nil,
        options: [
            NSInferMappingModelAutomaticallyOption: true,
            NSMigratePersistentStoresAutomaticallyOption: true
        ], error: &e)

    if(e != nil){
            var error: NSError? = nil
            coordinator = nil
            // Report any error we got.
            let dict = NSMutableDictionary()
            dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data"
            dict[NSLocalizedFailureReasonErrorKey] = "There was an error creating or loading the application's saved data."
            dict[NSUnderlyingErrorKey] = error
            error = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict as [NSObject : AnyObject])
            Logger.Error("Serious error \(error), \(error!.userInfo)")
            abort()
    }

    coordinator.createManagedObjectContexts()
    coordinator.managedObjectCache = RKInMemoryManagedObjectCache(managedObjectContext: coordinator.persistentStoreManagedObjectContext)

    return coordinator
    }()
单元测试:

class TestRestMappers: XCTestCase {

    let rootEndpoint = RootEndpoint()

    override func setUp() {
        super.setUp()

        let testTargetBundle = NSBundle(identifier: "anita-borg.malaria-iosTests")
        RKTestFixture.setFixtureBundle(testTargetBundle)
    }

    func testRootEndpointMapper() {
        let parsedJson: AnyObject? = RKTestFixture.parsedObjectWithContentsOfFixture("api.json")

        let mapping = rootEndpoint.mapping

        let test = RKMappingTest(forMapping: mapping, sourceObject: parsedJson, destinationObject: nil)

        test.addExpectation(RKPropertyMappingTestExpectation(sourceKeyPath: "users", destinationKeyPath: "users"))

        XCTAssertTrue(test.evaluate)
    }
}
我从控制台收到的错误消息是:

*** Assertion failure in -[RKMappingTest dataSourceForMappingOperation:], (...): error: 
-[malaria_iosTests.TestRestMappers testRootEndpointMapper] : XCTAssertTrue failed: throwing "Cannot test an `RKEntityMapping` with a nil managed object context." - 

Test Case '-[malaria_iosTests.TestRestMappers testRootEndpointMapper]' failed (0.010 seconds).
连接存储的映射片段:

let managedObjectStore: RKManagedObjectStore = CoreDataStore.sharedInstance.persistentStoreCoordinator!
let rootMap = RKEntityMapping(forEntityForName: name, inManagedObjectStore: managedObjectStore)
我已经在很多地方找到了问题的根源,但似乎找不到解决办法

先谢谢你

编辑:

NSManagedObjectContext:

lazy var backgroundContext: NSManagedObjectContext? = {
    let coordinator = self.store.persistentStoreCoordinator?.persistentStoreCoordinator
    if coordinator == nil {
        return nil
    }

    var backgroundContext = NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.PrivateQueueConcurrencyType)
    backgroundContext.persistentStoreCoordinator = coordinator
    return backgroundContext
    }()

测试需要配置。通常,您应该假设,如果您没有显式地为测试提供一些信息,那么它就没有任何信息。因此,您需要为测试提供一个可使用的上下文(在您的特定情况下可能是一个数据源)


您没有设置
test的
managedObjectContext
,虽然我不明白,但我认为它是生产测试和单元测试的核心数据/restkit堆栈的横向。那么我怎样才能为测试提供一个呢?您有一个显式映射测试,映射没有显式地使用/保留用于创建它的实体的MOC,因此您需要使用上下文来配置测试,以便我理解。但是当我调用coordinator.createManagedObjectContexts()时,这不就包括在内了吗?。通过创建上下文的文档:“为接收方创建持久存储和主队列管理对象上下文”,当然。你的意思是说你期待着测试出来寻找一个MOC来使用吗?我理解!成功了!感谢您的快速回答和反馈!我是新来的,我怎么能投票给你?(并将此标记为正确答案)编辑:标记为已解决:)
test.managedObjectContext = ...