【问题标题】:Swift 2.0 Unit Testing for NSCoding用于 NSCoding 的 Swift 2.0 单元测试
【发布时间】:2015-11-08 21:51:44
【问题描述】:

我将尝试使用 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 类中测试这些方法。

【问题讨论】:

    标签: swift unit-testing xctest nscoding


    【解决方案1】:

    摆脱问题总是有帮助的。

    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)
    }
    

    【讨论】:

    • 为了完成这个,我会在测试结束时添加文件删除。虽然它位于 temp 目录中,但不必清除它,并且单元测试不应改变任何状态。
    • 修复了一些弃用警告:let locToSave = path.appendingPathComponent("tests_partners") NSKeyedArchiver.archiveRootObject(newPartner, toFile: locToSave) let data = NSKeyedUnarchiver.unarchiveObject(withFile: locToSave) as?
    【解决方案2】:

    上面的答案(@dogcoffee's)是正确的,添加了一些我已经修复的弃用警告

    let locToSave = path.appendingPathComponent("teststasks")
    
    NSKeyedArchiver.archiveRootObject(newPartner, toFile: locToSave)
    
    let data = NSKeyedUnarchiver.unarchiveObject(withFile: locToSave) as? YourClass
    

    【讨论】:

      【解决方案3】:

      稍微改进一下@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,然后返回解包后的值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多