2016-07-14 6 views
4

Я работаю над приложением iOS, написанным в Swift, которое анализирует много файлов JSON. Структуры JSON сложны, и я должен был их протестировать, прежде чем отображать JSON для объекта.Единичное тестирование JSON Swift

Например, проверьте, существует ли «пользователь» ключа и для каждого пользователя структура («имя», «первая», «последняя»).

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

Есть ли хороший способ сделать это?

Спасибо.

ответ

1

Благодарим вас за сообщение @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)].") 
} 
1

Единственный способ добиться этого - это действительно открыть файл JSON и проверить каждое свойство.

Хорошая новость заключается в том, что, поскольку Swift 2.0 вы можете использовать охранник, чтобы проверить, если вы можете назначить правильное значение для вара или позволить, так что вы можете создать функцию следующим образом:

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 
} 

лучшей практику было бы также реализовать использование Исключений вместо того, чтобы возвращать false в каждом предложении охраны.

Смежные вопросы