Насмешка подкласса NSManagedObject

Я пишу кейсы XCTest, но застрял в одном месте. У меня есть автомобиль класса в моей основной цели, который является подклассом NSManagedObject. Я создаю макет, который будет иметь массив объектов класса Car. Но всякий раз, когда я использую сеттер для элементов 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»


person Community    schedule 17.02.2017    source источник


Ответы (2)


Это связано с тем, что Car является подклассом NSManagedObject, что означает, что он должен быть инициализирован назначенным инициализатором: initWithEntity:insertIntoManagedObjectContext:.

В этой небольшой статье вы можете найти больше информации о работе с NSMangedObjects и XCTests: https://www.andrewcbancroft.com/2015/01/13/unit-testing-model-layer-core-data-swift/

person Prientus    schedule 17.02.2017

Вы можете полностью переопределить геттеры свойств подкласса 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
        }
    }
}

Теперь использование в тесте просто let stubCar = StubCar(), и нет сбоев, связанных с CoreData, когда производственный код обращается к свойствам, и вам вообще не нужно настраивать полный стек CoreData в памяти. Отмените также сеттер, если вам нужно. Это предполагает, что ваш уровень данных должным образом абстрагирован, поэтому вы можете просто внедрить эти модели туда, где они необходимы, и написать тесты как таковые.

person Phil    schedule 21.02.2019