Swift 2.0 NSCoding 单元测试
Swift 2.0 Unit Testing for 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
class.
中测试这些方法
远离问题总是有帮助的。
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's) 是正确的,添加了一些我已修复的弃用警告
let locToSave = path.appendingPathComponent("teststasks")
NSKeyedArchiver.archiveRootObject(newPartner, toFile: locToSave)
let data = NSKeyedUnarchiver.unarchiveObject(withFile: locToSave) as? YourClass
稍微改进@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
,然后 return 展开的值。
我将尝试使用 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
class.
远离问题总是有帮助的。
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's) 是正确的,添加了一些我已修复的弃用警告
let locToSave = path.appendingPathComponent("teststasks")
NSKeyedArchiver.archiveRootObject(newPartner, toFile: locToSave)
let data = NSKeyedUnarchiver.unarchiveObject(withFile: locToSave) as? YourClass
稍微改进@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
,然后 return 展开的值。