前一天我們測了 array 的數量,測試的 json 轉成 User (事實上是 [UserElement]),並確定 array 的 count 數是 3 個。但我們並沒有真正的測到每個物件。
依照前面幾天的案例 feature 擴充
如果進行需求變更,而改動 Decodable Model 的 property,在這個狀況下,目前的測試案例,是保護不了的。
所以,我們繼續補測試,在 UserElementTests 再加一個測試.
func testFirstUser() throws {
let data = getRawData()
let users = try JSONDecoder().decode(User.self, from: data)
/// 在這邊取出第 0 個 element
let firstUser = users.first
/// firstUser 是 optional 的,這時可以用 XCTUnwrap 將 optional 轉出,因為我們確定有值且要拿第 0 個來測
let model = try XCTUnwrap(firstUser)
}
在取得 model 的下方,就可以開始用 XCTAssertEqual 開始測 model,第一個要測的是 id,但請記得,第一次跑測試的時候,要讓 test failed,所以我們先讓 XCTAssertEqual 的第二個參數為 0,讓測試 failed。
這邊用 id, name, username, email, phone, website 為例子,address 與 company 就不寫了。讀者可以自行去測 address 部分和 company 部分
func testFirstUser() throws {
let data = getRawData()
let users = try JSONDecoder().decode(User.self, from: data)
/// 在這邊取出第 0 個 element
let firstUser = users.first
/// firstUser 是 optional 的,這時可以用 XCTUnwrap 將 optional 轉出,因為我們確定有值且要拿第 0 個來測
let model = try XCTUnwrap(firstUser)
XCTAssertEqual(model.id, 1)
XCTAssertEqual(model.name, "Leanne Graham")
XCTAssertEqual(model.username, "Bret")
XCTAssertEqual(model.email, "Sincere@april.biz")
XCTAssertEqual(model.phone, "1-770-736-8031 x56442")
XCTAssertEqual(model.website, "hildegard.org")
}
未來,在這些 property 有變化的時候,我們也可以保證這些測試能發揮作用,幫你擋下會閃退的狀況。以筆者的親身經歷而言,真的遇過物件的宣告從 Int 變成 String,或是從 String 變成 Int 的狀況。在沒寫測試的情形下,當然也是可以進行更改,但在還發佈到 App Store 的時候,總是能被使用者發現沒改到的地方,然後就反應給客服了。這時候,負責的工程師 (就是筆者),即使是假日,也要把電腦打開,更改後進行發版和送審。
所以,你的專案真的需要測試嗎? Yes. You need testing! (如果你不想常常加班的話)