ios - 使用示例核心数据进行单元测试

标签 ios swift unit-testing core-data nsmanagedobjectcontext

这是我的 XCTestCase 类的开始:

var moc: NSManagedObjectContext!

    override func setUp() {
        super.setUp()

        moc = self.setUpInMemoryManagedObjectContext()
        self.fillManagedObjectContextWithExampleData(moc)
    }

    func setUpInMemoryManagedObjectContext() -> NSManagedObjectContext {

        let modelName = "ProjectApp"
        let modelURL = NSBundle.mainBundle().URLForResource(modelName, withExtension:"momd")!
        let managedObjectModel = NSManagedObjectModel(contentsOfURL: modelURL)!

        let persistentStoreCoordinator = NSPersistentStoreCoordinator(managedObjectModel: managedObjectModel)
        persistentStoreCoordinator.addPersistentStoreWithType(NSInMemoryStoreType, configuration: nil, URL: nil, options: nil, error: nil)

        let managedObjectContext = NSManagedObjectContext()
        managedObjectContext.persistentStoreCoordinator = persistentStoreCoordinator

        return managedObjectContext
    }

    func fillManagedObjectContextWithExampleData(context: NSManagedObjectContext) {
        // var firstSC = NSEntityDescription..insertNewObjectForEntityForName("StaticContent", inManagedObjectContext: context) as! StaticContent
        var staticContentEntity = NSEntityDescription.entityForName("StaticContent", inManagedObjectContext: context)!

        var firstSC = StaticContent(entity: staticContentEntity, insertIntoManagedObjectContext: context)
        firstSC.name = "First Name"

        var secondSC = StaticContent(entity: staticContentEntity, insertIntoManagedObjectContext: context)
        secondSC.name = "Second Name"

        var error: NSError? = nil

        if context.save(&error) {
            return
        }
    }

我只想创建 ManagedObjectContext (在内存中,仅用于测试)并用示例数据填充它。所以我可以使用:

managedObjectContext.executeFetchRequest(fetchRequest, error: nil) as! [StaticContent]

在我的单元测试中。它执行,但是当我调用需要 [StaticContent] 的函数时,我收到错误:

fatal error: NSArray element failed to match the Swift Array Element type

那么这有什么问题呢?我称之为的函数运行良好。当我在我的应用程序中使用它而不是在单元测试中时,我没有问题。那么我做错了什么?

最佳答案

我真的不想回答我的问题,但我已经找到了答案,并且我想帮助其他人。我发现了一部分代码,它根据实体的运行目标来更改实体类名称。因此,我在创建 NSManagedObjectModel 的位置添加了这些代码行,它有帮助:

    // Create the module name
    let moduleName = "ProjectAppTests"

    // Create a new managed object model with updated entity class names
    var newEntities = [] as [NSEntityDescription]
    for (_, entity) in enumerate(managedObjectModel.entities) {
        let newEntity = entity.copy() as! NSEntityDescription
        newEntity.managedObjectClassName = "\(moduleName).\(entity.name)"
        newEntities.append(newEntity)
    }
    let newManagedObjectModel = NSManagedObjectModel()
    newManagedObjectModel.entities = newEntities

    let persistentStoreCoordinator = NSPersistentStoreCoordinator(managedObjectModel: newManagedObjectModel)

不知道为什么使用 Swift Core Data 中的类名如此复杂。但它很有帮助,而且现在正在发挥作用。

关于ios - 使用示例核心数据进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31163982/

相关文章:

c# - 使用 NUnit 和 C# 对异步方法进行单元测试

swift - Mac 操作系统 : Show custom file size in finder attributes and get info without kernel

SwiftUI 如何使用选择作为列表创建 LazyVStack

unit-testing - Dart/flutter : Share common setUp/tearDown methods among test suites

objective-c - 如何从 CGPath 中删除子路径?

ios - 如何使用一个不是 tableview 成员的开关禁用 tableview 单元格的所有文本字段?

.net - 为什么 NHibernate 会自动截断而不是在保存时抛出异常?

objective-c - 使用核心数据实体作为枚举?

c++ - XCode 9.3 升级或替换 libc++

ios - 在 iOS8 中使用 Home kit 框架设置家庭