Модульное тестирование Swift 2.0 для NSCoding
Я собираюсь попробовать и использовать новые функции тестирования в Xcode 7 (покрытие кода) и Swift 2.0.
Используя покрытие кода, я вижу, что я не тестирую свои методы NSCoding.
Для тривиального примера сохранения нескольких деталей, таких как
required init(coder aDecoder: NSCoder) {
name = aDecoder.decodeObjectForKey("name") as! String
time = aDecoder.decodeIntegerForKey("time")
}
func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeInteger(time, forKey: "time")
aCoder.encodeObject(name, forKey: "name")
}
Как мне пройти тестирование этих методов в классе XCTest.
3 ответа
Уход от проблемы всегда помогает.
func testDecoder() {
let path = NSTemporaryDirectory() as NSString
let locToSave = path.stringByAppendingPathComponent("teststasks")
let newTask = Task(name: "savename", time: "10")
// save tasks
NSKeyedArchiver.archiveRootObject([newTask], toFile: locToSave)
// load tasks
let data = NSKeyedUnarchiver.unarchiveObjectWithFile(locToSave) as? [Task]
XCTAssertNotNil(data)
XCTAssertEqual(data!.count, 1)
XCTAssertEqual(data!.first?.name, "savename")
XCTAssertEqual(data!.first?.time, 10)
}
Немного улучшив ответ @DogCoffee, если вы не хотите создавать реальные файлы во время тестов, а просто вместо этого кодируете и декодируете в простой
Data
буфер на основе памяти:
func testDecoder() throws {
let savedTask = Task(name: "savename", time: "10")
let encodedData = try NSKeyedArchiver.archivedData(withRootObject: [savedTask], requiringSecureCoding: false)
let loadedTasks = try XCTUnwrap(try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(encodedData) as? [Task])
XCTAssertEqual(loadedTasks.count, 1)
let loadedTaks = loadedTasks.first!
XCTAssertEqual(loadedTask.name, "savename")
XCTAssertEqual(loadedTask.time, 10)
}
Здесь также используется более новый
XCTUnwrap(expression)
API для подтверждения того, что выражение не
nil
, а затем верните развернутое значение.
Приведенный выше ответ (@dogcoffee's) правильный, добавлены некоторые предупреждения об устаревании, которые я исправил
let locToSave = path.appendingPathComponent("teststasks")
NSKeyedArchiver.archiveRootObject(newPartner, toFile: locToSave)
let data = NSKeyedUnarchiver.unarchiveObject(withFile: locToSave) as? YourClass