我正在写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”
这是因为Car是一个NSManagedObject子类,这意味着它必须使用其指定的初始化程序初始化:initWithEntity:insertIntoManagedObjectContext:
。
在这篇小文章中,您可以找到有关使用NSManagedObjects和UI测试的更多信息:qazxsw poi
您可以在测试目标中的新存根子类中完全覆盖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。这假设您已正确抽象出数据层,因此您可以在需要的地方注入这些模型并编写测试。