NSManagedObject子类嘲弄

问题描述 投票:1回答:2

我正在写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”

swift xctest
2个回答
2
投票

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

在这篇小文章中,您可以找到有关使用NSManagedObjects和UI测试的更多信息:qazxsw poi


2
投票

您可以在测试目标中的新存根子类中完全覆盖https://www.andrewcbancroft.com/2015/01/13/unit-testing-model-layer-core-data-swift/子类属性getter。 NSManagedObject工作正常。

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 } } } ,当生产代码访问属性时,没有与CoreData相关的崩溃,并且您根本不需要设置完整的内存CoreData堆栈。如果需要,也可以覆盖setter。这假设您已正确抽象出数据层,因此您可以在需要的地方注入这些模型并编写测试。

© www.soinside.com 2019 - 2024. All rights reserved.