Json 单元测试
我正在开发一个用Swift编写的iOS应用程序,它可以解析很多JSON文件。 JSON结构非常复杂,我希望在将JSON映射到对象之前先对其进行测试 例如,测试键“users”是否存在,以及每个用户的结构(“name”、“first”、“last”) 有什么好办法吗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:
谢谢。实现这一点的唯一方法是真正打开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)].")
}