如何对使用SingleValueDecodingContainer的Decodable合规性做单元测试
别担心,我来帮你搞定这个单元测试的问题!首先咱们先确认你的Identifier实现是没问题的,接下来我给你两种常见场景的测试方案,直接就能用在XCTest里:
解决Identifier类型的单元测试问题
1. 单独测试Identifier的解码
如果想单独验证Identifier能不能正确解码字符串值,可以写这样的测试:
import XCTest @testable import YourAppModule // 替换成你的实际模块名 class IdentifierTests: XCTestCase { func testIdentifierDecoding() throws { // 1. 准备测试用的JSON数据(单个字符串格式) let jsonData = "\"abc123\"".data(using: .utf8)! // 2. 尝试解码 let identifier = try JSONDecoder().decode(Identifier.self, from: jsonData) // 3. 验证解码结果符合预期 XCTAssertEqual(identifier.string, "abc123") } func testIdentifierDecodingFailure() { // 测试非字符串类型的JSON,确保解码会抛出正确错误 let invalidJsonData = "12345".data(using: .utf8)! XCTAssertThrowsError(try JSONDecoder().decode(Identifier.self, from: invalidJsonData)) { error in guard let decodingError = error as? DecodingError else { XCTFail("Expected DecodingError, got \(type(of: error))") return } // 验证错误类型为类型不匹配 XCTAssertEqual(decodingError.errorCode, .typeMismatch) } } }
2. 测试包含Identifier的复杂模型
如果是测试你例子里那种带identifier字段的完整JSON,首先得先定义对应的父模型:
struct SomeModel: Decodable { let identifier: Identifier // 其他属性根据你的实际需求补充 }
然后对应的测试代码:
extension IdentifierTests { func testSomeModelDecoding() throws { // 准备完整的JSON数据 let jsonString = """ { "identifier": "abc123" // 可以补充其他测试需要的属性 } """ let jsonData = jsonString.data(using: .utf8)! // 解码整个模型 let model = try JSONDecoder().decode(SomeModel.self, from: jsonData) // 验证Identifier的取值正确 XCTAssertEqual(model.identifier.string, "abc123") } }
常见测试坑点提醒
- 别忘导入模块:如果
Identifier在主应用模块里,测试用例必须加@testable import YourAppModule,否则访问不到内部类型。 - JSON格式要精准:单独测试
Identifier时,JSON是带双引号的单个字符串("abc123"),不是对象——因为你用了singleValueContainer()来解码单值。 - 错误场景要覆盖:除了正常解码,一定要测试非法输入(比如数字、null、对象),确保解码失败时抛出预期错误,避免潜在崩溃。
这样写测试应该就能覆盖你的场景了,要是还有具体的报错或者特殊情况,可以再细化调整!
内容的提问来源于stack exchange,提问作者vrutberg
相关产品推荐
相关产品推荐

