繁体   English   中英

单元测试JSON Swift

[英]Unit testing JSON Swift

我正在研究一个用Swift编写的iOS应用程序,它解析了很多JSON文件。 JSON结构很复杂,我想在将JSON映射到对象之前测试它们。

例如,测试关键字'用户'是否存在以及每个用户是否存在结构('name','first','last')。

{
  "users": [
    {
      "name": {
        "first": "emmi",
        "last": "wiita"
      }
    },
    {
      "name": {
        "first": "erdi",
        "last": "nielen"
      }
    },
    {
      "name": {
        "first": "daniel",
        "last": "beck"
      }
    }
 ]
}

有什么好办法吗?

谢谢。

实现这一目标的唯一方法是打开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文件的好方法。

我实现了一个枚举ErrorType(Exception):

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

然后我可以像这样测试所有的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)].")
} 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM