Parfois, vous écrivez du code de test tel que Codable pour la couche Model et souhaitez comparer les chaînes JSON attendues. Cependant, les formats de format KeyValue tels que JSON ne sont pas dans un ordre particulier et ne peuvent pas être simplement comparés.
Ensuite, j'ai trouvé une méthode pour créer un type de dictionnaire et comparer.
extension String {
func jsonDictionary() throws -> [String: AnyHashable]? {
guard let data = self.data(using: .utf8) else { return nil }
return try data.jsonDictionary()
}
}
extension Data {
func jsonDictionary() throws -> [String: AnyHashable]? {
return try JSONSerialization.jsonObject(with: self, options: []) as? [String: AnyHashable]
}
}
Si vous préparez une fonction qui renvoie le résultat de JSONSerialization.jsonObject
en tant qu'extension de données et que vous ajoutez une fonction qui la transmet via l'extension String, par exemple, le code de test suivant peut être évalué avec XCTAssertEqual.
func test_HogeEncode() {
let object = Hoge(value: 123, flag: true)
let expectation = """
{
"value": "123",
"flag": "true"
}
"""
let data = try? JSONEncoder().encode(object)
XCTAssertNotNil(data)
XCTAssertEqual(try? expectation.jsonDictionary(), try? data!.jsonDictionary())
}