Day 25 透過 Code Review 發現 loadItems() 沒有檢查資料格式,Day 26 則把問題整理成明確需求,再交給 AI 修改。
AI 完成後表示:
storage.ts
因為這些一樣都是由 AI 提供的結果,所以如果看到「檢查通過」,就覺得應該沒什麼問題吧?然後直接接受,感覺也只是換個方式相信 AI 而已。所以這次想試著自己對照修改後的程式碼與檢查結果,看看它是不是真的有按照需求運作。
先回頭確認自己在 Day 26 提出的內容:
在
JSON.parse()後確認資料是陣列,並檢查每一筆資料是否符合CollectionEntry的格式。資料格式不正確時,回傳空陣列。
AI 新增了 isCollectionEntry(),逐一檢查:
null
id 和 title 是否為字串type 是否為 manga 或 anime
status 是否為 want、watching 或 completed
loadItems() 也加入:
Array.isArray(parsedItems)
確認最外層是陣列,再使用:
parsedItems.every(isCollectionEntry)
確認陣列中的每一筆資料都通過檢查。
從程式碼來看,修改內容確實有對應到原本提出的需求。
接著執行專案原本的 Lint:
npm run lint
結果沒有出現錯誤。
另外也執行 TypeScript 檢查:
npm exec tsc -- --noEmit -p tsconfig.app.json
--noEmit 表示只進行型別檢查,不另外產生 JavaScript 檔案。這項檢查也成功通過。
到這邊至少可以先確認,AI 新增的內容沒有造成明顯的規則或型別錯誤。
只有檢查工具通過還不夠,因為這次修改的重點是處理 localStorage 裡不同格式的資料。
所以除了正常資料之外,也整理了幾種需要確認的情況:
| 測試情況 | 預期結果 |
|---|---|
| 沒有保存資料 | 回傳空陣列 |
| 保存正常的收藏陣列 | 成功讀取收藏資料 |
| JSON 格式錯誤 | 回傳空陣列 |
| JSON 正確,但內容不是陣列 | 回傳空陣列 |
| 是陣列,但其中一筆資料格式錯誤 | 回傳空陣列 |
測試時可以使用另外開啟的無痕視窗,避免影響瀏覽器中原本保存的收藏資料。
最後,這幾種情況都得到預期結果:
沒有資料:PASS
正常資料:PASS
錯誤 JSON:PASS
不是陣列:PASS
單筆格式錯誤:PASS
這表示新增的檢查不只可以處理 JSON.parse() 失敗,也能處理「JSON 可以成功還原,但內容不是收藏資料」的情況。
這次的修改通過了基本檢查,也符合原本提出的需求,但這不代表程式從此就不可能出錯。
目前只是測試了幾種比較容易想到的情況,如果未來又替 CollectionEntry 增加新的作品類型或觀看狀態,isCollectionEntry() 裡的檢查可能也要記得一起調整。
但和修改前相比,現在至少不會在 JSON.parse() 成功後就直接相信資料,而是多了一層實際的格式確認。
測試的目的不是證明程式永遠不會出錯,而是確認這次修改確實處理了原本發現的問題。
從 Day 25 找到問題、Day 26 把修改交給 AI,再到這次自己重新檢查,算是走完了一次從發現問題到確認結果的流程。AI 可以負責產生修改,但看懂它改了什麼、確認是否符合需求,仍然是自己需要做的事情。
下篇見~