
同時完成測試與文件 - Cucumber 的文件測試法
在實際了解 Cucumber 的應用方式之前,我一直認為使用 Cucumber 撰寫測試是一件非常麻煩的事情,因為我們會需要實作許多 Step Definition(步驟定義)來讓文件中的某個行為可以被使用。
然而,當我了解到 Cucumber 的價值之後,就變成我優先選用的工具。
在實際了解 Cucumber 的應用方式之前,我一直認為使用 Cucumber 撰寫測試是一件非常麻煩的事情,因為我們會需要實作許多 Step Definition(步驟定義)來讓文件中的某個行為可以被使用。
然而,當我了解到 Cucumber 的價值之後,就變成我優先選用的工具。
大學的時候曾對朋友說過「極限不是用來超越的嗎?」這句話,即使畢業後快要十年,仍然符合現況。在 2023 即將結束,開始「這一年」似乎很適合用這句話作為標題。
今年參加的最後一場研討會 RubyConf Taiwan 在昨天結束,比較意外的點大概是意外的玩得挺開心,倒是讓我有一點每次去日本參加 RubyKaigi 會在 After Party 跟很多人交流的感覺。
google/wire 是一個依賴注入(Dependency Injection)的工具,透過程式碼生成(Code Generate)來幫助我們解決 Golang 中一個物件對另一個物件有依賴關係時,需要事先產生的問題。
在開始這篇之前,也建議閱讀從 wire 學到依賴注入沒有講的事了解一些基本的概念。
這一系列算是一個新的嘗試,以往在撰寫技術文章時大多會將許多情報壓縮在一篇的內容中討論,然而這樣的情報量對許多人來說仍然是負擔很大的。
即使將其拆分到約四個月的內容量,我仍發現很難在不細說 Domain-Driven Design、Clean Architecture 等等觀念完善的解釋,但我還是選擇不特別去提出這些內容。
Entity(實體) 和 Aggregate(聚合) 是商業邏輯的基礎要素,我們將資料轉換成有意義的資訊,若要討論到該如何運用這些資料,那麼就屬於 Service(服務)和 Use Case(使用案例)的負責的部分。
倉庫跟實體是相當基本的概念,然而還不足以涵蓋更多的情境。我們還需要討論 Aggregate(聚合)的情況,以我們這次的例子來說,就是一種聚合的表現。有了 Aggregate 的概念後,就可以逐步看出一個系統的邊界。
在我們實作訂閱功能的過程中,提到了像是 Entity(實體)還有 Repository(倉庫)等關鍵字,現在我們要來回顧一些這些使用的物件有怎樣的特性,在 Rails 中我們應該如何使用,才能避免預期外的問題。
經過這段時間的實作,我們的規格已經逐漸確定下來而且更加清晰,現在我們終於到了決定儲存方式的階段,目前的功能採用關聯式資料庫(RDBMS)儲存算是相當適合的方式,因此我們可以直接利用 ActiveRecord 來實現。
假設我們繼續確認訂閱的需求,發現現有的功能無法記錄使用者在何時進行延展,因此希望加入「在 2023-03-14 延展」的資訊在畫面上,然而我們現在是使用整數儲存在 Subscription
的 #items
屬性中,除了無法明確表達意義外,也不容易再繼續擴充。