我今天开始使用 BDD 方法编写 iOS 单元测试。我有一个关于guard
语句和达到 100% 代码覆盖率的问题。
我有以下代码,它处理对象的Data
转换Customer
。
internal final class func customer(from data: Data) -> Customer? {
do {
guard let jsonDictionary = try JSONSerialization.jsonObject(with: data, options: []) as? Dictionary<String, Any> else {
return nil
}
var customerFirstName: String? = nil
var customerLastName: String
if let firstName = jsonDictionary["first_name"] as? String {
customerFirstName = firstName
}
guard let lastName = jsonDictionary["last_name"] as? String else {
return nil
}
customerLastName = lastName
return Customer(firstName: customerFirstName, lastName: customerLastName)
} catch {
return nil
}
}
创建我们的后端时,一些客户只获得了一个姓氏,其中包含他们的名字和姓氏。这就是为什么客户的名字是可选的;他们的全名可能是last_name
.
在我的代码中,客户的名字是可选的,而他们的姓氏是必需的。如果从网络请求收到的 JSON 中没有返回他们的姓氏,那么我不会创建客户。此外,如果Data
无法序列化为Dictionary
,则不会创建客户。
我有两个 JSON 文件,它们都包含我用来测试这两个场景的客户信息。
一个在 JSON 中不包含名字:
{
"first_name": null,
"last_name": "Test Name",
}
另一个包含 JSON 中的名字:
{
"first_name": "Test",
"last_name": "Name",
}
在我的单元测试中,使用 Quick 和 Nimble,我在Customer
名字不可用时处理了 a 的创建:
override func spec() {
super.spec()
let bundle = Bundle(for: type(of: self))
describe("customer") {
context("whenAllDataAvailable") {
it("createsSuccessfully") {
let path = bundle.path(forResource: "CustomerValidFullName", ofType: "json", inDirectory: "ResponseStubs")!
let url = URL(fileURLWithPath: path)
let data = try! Data(contentsOf: url)
let customer = DataTransformer.customer(from: data)
expect(customer).toNot(beNil())
}
}
context("whenMissingLastName") {
it("createsUnsuccessfully") {
let path = bundle.path(forResource: "CustomerMissingLastName", ofType: "json", inDirectory: "ResponseStubs")!
let url = URL(fileURLWithPath: path)
let data = try! Data(contentsOf: url)
let customer = DataTransformer.customer(from: data)
expect(customer).to(beNil())
}
}
}
}
这可确保我Customer
在返回的 JSON 中缺少或存在第一个名称时创建一个。
当我的代码由于数据能够转换为有效的 JSON 对象而没有命中语句的else
子句时,如何使用 BDD 达到此方法的 100% 代码覆盖率?guard
我是否应该只添加另一个.json
包含无法转换为 JSON 对象的数据的文件以确保Customer
未创建 a 以及.json
包含缺失的文件last_name
以确保Customer
未创建 a ?
我只是在想“100% 代码覆盖率”的概念吗?我什至需要测试语句的else
子句吗?guard
我什至有使用 BDD 方法的适当方法吗?