[英]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.