NSManagedObject子类嘲弄

时间:2017-02-17 19:44:05

标签: swift xctest

我正在写XCTest案例,但我被困在一个地方。 我的主目标中有一辆Class Car,它是NSManagedObject的子类。我正在创建具有Car类对象数组的mock。但每当我使用setter作为Car的元素时,它就会崩溃。

在主要目标

class Car: NSManagedObject {

    @NSManaged var name: String

}

在测试目标中

class CarTests: XCTestCase {



    func testCar() {

        let car = getMyCar()
        // Some asserts here

    }

    func getMyCar() -> Car {
        let car: Car = Car.Init()
        car.name = "Ferrari"

        return car
    }

}

我设置车名时会崩溃。任何想法如何创建汽车对象的模拟数据?

错误 - 失败:捕获“NSInvalidArgumentException”,“ - [MyProject.Car setName:]:无法识别的选择器发送到实例0x310434347f200”

2 个答案:

答案 0 :(得分:2)

这是因为Car是一个NSManagedObject子类,这意味着它必须使用其指定的初始值设定项进行初始化:initWithEntity:insertIntoManagedObjectContext:

在这篇小文章中,您可以找到有关使用NSMangedObjects和XCTests的更多信息: https://www.andrewcbancroft.com/2015/01/13/unit-testing-model-layer-core-data-swift/

答案 1 :(得分:1)

您可以完全覆盖测试目标中新的存根子类中的NSManagedObject子类属性getter。 self.init()工作正常。

class StubCar: Car {
    convenience init(name: String = "") {
        self.init()
        self.stubbedName = name
    }

    var stubbedName: String = ""
    override var name: String {
        set {}
        get {
            return stubbedName
        }
    }
}

现在,测试中的用法仅为let stubCar = StubCar(),并且当生产代码访问属性并且您根本不需要设置完整的内存CoreData堆栈时,就没有与CoreData相关的崩溃。如果需要,也可以覆盖设置器。假设您已经正确地抽象了数据层,那么您可以将这些模型注入到需要的地方并编写测试。