我正在写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”
答案 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相关的崩溃。如果需要,也可以覆盖设置器。假设您已经正确地抽象了数据层,那么您可以将这些模型注入到需要的地方并编写测试。