Json 单元测试

Json 单元测试,json,swift,unit-testing,swift2,Json,Swift,Unit Testing,Swift2,我正在开发一个用Swift编写的iOS应用程序,它可以解析很多JSON文件。 JSON结构非常复杂,我希望在将JSON映射到对象之前先对其进行测试 例如,测试键“users”是否存在,以及每个用户的结构(“name”、“first”、“last”) 有什么好办法吗 谢谢。实现这一点的唯一方法是真正打开JSON文件并测试每个属性 一个好消息是,由于Swift 2.0,您可以使用guard来测试是否可以为var或let分配有效值,因此您可以创建如下函数: func isValidJSON(data:

我正在开发一个用Swift编写的iOS应用程序,它可以解析很多JSON文件。 JSON结构非常复杂,我希望在将JSON映射到对象之前先对其进行测试

例如,测试键“users”是否存在,以及每个用户的结构(“name”、“first”、“last”)

有什么好办法吗


谢谢。

实现这一点的唯一方法是真正打开JSON文件并测试每个属性

一个好消息是,由于Swift 2.0,您可以使用guard来测试是否可以为var或let分配有效值,因此您可以创建如下函数:

func isValidJSON(data: NSData) -> Bool {
    json = try NSJSONSerialization.JSONObjectWithData(data, options: .AllowFragments)

    // if "users" exists on the JSON
    // AND we can cast it to an array of dictionaries
    guard let users = json["users"] as [[String: AnyObject]] else {
      return false
    }

    for user in users {
        guard let name = user["name"] as [[String: AnyObject]]
            firstName = name["first"] as String,
            lastName = name["last"] as String else {
                return false
        }
    }

    // valid JSON
    return true
}

最好的做法是使用异常,而不是在每个guard语句中返回false。

谢谢您的帖子@Felipe-Plets。我找到了一个测试JSON文件的好方法

我实现了一个枚举错误类型(异常):

然后我可以像这样测试所有JSON文件:

func isValidJSON(message: [String: AnyObject]) -> throws {
    guard let sosId = message["id"] as? String 
        else { throw ReceiverError.MissingKeyOrType(key: "sos - id") }
    guard let text = message["text"] as? String 
        else { throw ReceiverError.MissingKeyOrType(key: "text")
}

let json = ... Get JSON

do {
   try isValidJSON(json)
} catch CustomReceiver.ReceiverError.MissingKeyOrType(let key) {
   print("Error: Missing key or type [key: \(key)].")
} 
/**
 Enumeration describing possible errors that occur while parsing 
 a message from JSON file.
*/
enum ReceiverError: ErrorType {
    /**
     Error trigge when the key is missed or the type.
     - Parameter key: Key missed.
    */
    case MissingKeyOrType(key: String)
}
func isValidJSON(message: [String: AnyObject]) -> throws {
    guard let sosId = message["id"] as? String 
        else { throw ReceiverError.MissingKeyOrType(key: "sos - id") }
    guard let text = message["text"] as? String 
        else { throw ReceiverError.MissingKeyOrType(key: "text")
}

let json = ... Get JSON

do {
   try isValidJSON(json)
} catch CustomReceiver.ReceiverError.MissingKeyOrType(let key) {
   print("Error: Missing key or type [key: \(key)].")
}