NSManagedObject子类模拟测试

7
我正在编写XCTest测试用例,但我卡在了一个地方。 我的主目标中有一个名为Car的类,它是NSManagedObject的子类。我正在创建模拟数据,其中包含Car类的对象数组。但每当我使用Car对象的setter设置元素时,就会导致崩溃。
在主目标中。
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个回答

8

您可以在测试目标中创建一个新的存根子类并完全覆盖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堆栈。如果需要,也可以重写setter。这假定您已经适当地将数据层抽象化,因此您只需在需要的地方注入这些模型并编写相应的测试即可。

你没有收到错误 "CoreData: error: Failed to call designated initializer on NSManagedObject" 吗?也许另一种方法是简单地使用一个协议。在测试环境中,可以使用一个简单的存根。 - bauerMusic

5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接