練習 TDD, 紀錄題目中提到的一些值得思考研究的東西,以及參考到的一些 Mock 與 Stub 的文章。

前言

本次課題為透過「 TDD Kata 2 」練習 TDD,此題目為 TDD Kata 1 的延續題。

到目前「單元測試的藝術」已看到第三章後半段 (進度落後中),除了書之外,這段時間也有在網路上,看一些很厲害的人分享他們的測試經驗,若本次練習有遇到適用的部分,會試著在練習過程中實作,並筆記在這邊。

另外,這系列本質上還是在刷題練習 TDD,方便日後回過頭來看,若日後有心得可以針對某個議題集中討論時 (例如 Mock 使用案例與心得),就交給日後的我去寫了。

環境

環境同 TDD Kata 1

題目重點

  • What’s the difference between Mock and Stub?
  • Don’t faking too much, otherwise not really testing anything.
  • Testcase naming, 一個「好的測試案例命名」可以讓你更清楚你正在測試什麼

TODO: 關於「測試案例的命名」會另外寫一篇文章

練習重點

  • 測試案例的命名
  • 聚焦正在測什麼,不要測試超過兩件事
  • Data Provider 的練習,多測幾組不同的案例,但不用新增重複的測試方法

練習結果

請參考 commit 過程。

Data Provider 練習 commit

最近有點忙,後續測試 console output 的題目先擱置,日後有緣再研究。

筆記

記錄一下遇到的問題

- 「重構 > 測試 > 開發(+重構) > 通過測試」的節奏沒有掌握好
- 開發(+重構) 是先把功能寫對,通過測試,在把剛剛寫的功能重構,在通過一樣的測試
- 設計 ILoggerService 時,一下子寫了過多的 code,沒有遵循 baby step 的方式開發,導致一下子太多設計沒寫好,太多測試壞掉
- 應該先把 add() 重構好,決定要在哪邊插入寫 log 的動作,以及要如何觸發,但先不要真的去設計寫 log 的相關介面與實作

CallAdd_LogFailAndThrowException_GetExceptionMessageLogFail 時,mock 就直接過了?但是 AppServiceProvider 還沒綁定對的 INotify 對應的實例,這樣實作的部分還是有問題? 這樣是對的? ~''~

注意,測試的 setUp() 中的 parent::setUp() 永遠記得要放在第一行,application 是在此被重新初始化的,背後會跑 refreshApplication();

最後

過程中有另外再看了 這篇 關於 Laravel 如何實作 Service Container 的部分:

1. alias 中存放的 abstract => values,是讓 bindings 查表的地方,表示同一個「字串 (abstract)」同時對應到不同的「類別、介面 (string values)」名稱,這樣在實際 new 時,他才可以透過不同名字,找到同一個類別 (實現 Binding Interfaces To Implementations)
2. service container 中除了存放 bindings 之外,還存放了 instances,這樣 bind 的會去 bindings 對照要 new 什麼,而 instances 則提供 singleton 總是同樣的實例不會再重新 new
3. (作者說得對)有些東西很難在當下都搞清楚弄明白,就先去睡覺,或許醒來就通了

有任何問題或想法,歡迎留言交流,如果寫的內容有錯誤的地方,希望能不吝指點,感謝。

參考連結

這邊列出比較多的連結,主要是把這幾天有印象的、有看過的連結都列舉在這,方便自己以後可以回顧。



文章作者: littlebookboy
永久鏈結: https://blog.genesu.me/2021/07/tdd-daily-003-tdd-kata-string-calculator/
許可協議: 署名-非商業性使用-相同方式共享 4.0 國際(CC BY-NC-SA 4.0)