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 展开的值。