Модульное тестирование Декодируемые: как вы подходите к неверным данным? - PullRequest
1 голос
/ 21 октября 2019

Допустим, у вас есть JSON с несколькими полями:

Students: [
  student: {
    name: "Harry"
    surname: "Smith"
    age: 24
  },
 ...
]

и декодируемыми:

struct Students : Decodable {
    let student: [Student]
}

struct Student : Decodable {
    let name: String
    let surname: String
    let age: Int
}

Если вы хотите проверить недействительные данные, напишите ли вы последовательность тестов сследующие поддельные данные?

данные Test1:

{
name: null
surname: "Smith"
age: 24
}

данные Test2:

{
name: "Harry"
surname: null
age: 24
}

данные Test3:

{
name: "Harry"
surname: "Smith"
age: null
}

И, возможно,тест с неправильным типом?

{
name: "Harry"
surname: "Smith"
age: "24" //<- string
}

Итак, вы пишете все эти тесты, по одному для каждого из вышеуказанных jsons, или вам это не имеет смысла?

Ответы [ 3 ]

3 голосов
/ 24 октября 2019

Имеет смысл написать отдельный тест для каждой пары key-value, если мы не смогли увидеть причину сбоя, и нам пришлось обрабатывать ее самостоятельно для каждой пары. Например, старый способ JSONSerialization, чтобы получить Dictionary, а затем вручную проверять каждый key-value, если они существуют, если да, соответствует ли тип и т. Д. Если бы мы смогли получить все значения и ожидаемые, то мы бы использовали дляинициализируйте тип, например, Student. В этом сценарии вместо того, чтобы помещать так много if-else, чтобы сообщить о надлежащем сбое, можно подумать о отдельных случаях для каждой пары.

Теперь, когда мы выбросили Codable и error, четко предоставим всеинформация для сбоя, поэтому достаточно одного теста.

2 голосов
/ 24 октября 2019

Протокол Decodable предоставляет серию определенных ошибок декодирования.

Как уже упоминалось Кямраном, используйте один тест и отлавливайте все возможные ошибки декодирования, например

do {
    XCTAssertNoThrow(try JSONDecoder().decode(Students.self, from: data))
} catch let DecodingError.dataCorrupted(context) {
    XCTFail("Data corrupted: \(context.debugDescription)")
} catch let DecodingError.keyNotFound(key, context) {
    let message = "Key '\(key)' not found: \(context.debugDescription), codingPath: \(context.codingPath)"
    XCTFail(message)
} catch let DecodingError.valueNotFound(value, context) {
    let message = "Value '\(value)' not found: \(context.debugDescription), codingPath: \(context.codingPath)"
    XCTFail(message)
} catch let DecodingError.typeMismatch(type, context)  {
    let message = "Type '\(type)' mismatch: \(context.debugDescription), codingPath: \(context.codingPath)"
    XCTFail(message)
} catch {
    XCTFail(error.localizedDescription)
}
2 голосов
/ 24 октября 2019

Я бы прежде всего протестировал способ успеха хотя бы с одним случаем.

Также я бы протестировал несколько случаев со "граничными" значениями как необычныесимволы в строковых или целочисленных значениях около 32/64-битного порога.

Наконец, я бы проверил один случай, когда все необходимые (не необязательные) значения равны нулю . Если впоследствии вы измените модель, чтобы некоторые свойства были необязательными, этот тест не пройден, и вы сможете проверить, нужно ли вносить изменения из-за изменившихся обстоятельств.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...