快速通過測試的方法 - Rails 開發實踐
通過規格的分析我們準備好了 E2E Testing 的文件,以及對應的步驟實現,然而在這個狀態下是無法順利通過測試的,因此我們需要進行一些實作。在只有一條測試的狀況下,我們可以用非常簡單的方法通過這個測試。
加入路由
實踐 E2E Testing 的方式最直覺的做法就是「由外而內」對使用者來說開啟某個頁面是透過點選特定選單進行的,因此我們需要先加入一個路由來實現「我打開訂閱頁面」這個動作。
在前面的例子中,我們的步驟都是直接呼叫
visit
方法來進行,更好的做法是從首頁作為起點,以連續的動作進行,這樣才可以測出無法到達的頁面。
1Rails.application.routes.draw do
2 # ...
3 root to: 'plans#index'
4 resources :plans, only: %i[index]
5 resources :subscriptions, only: %i[index create]
6end
我們先將 /plans
和 /subscriptions
加入,實際上實作的時候也可以分開加入,控制最小的步驟也是確保每個 Commit(提交)不會一口氣修改過多的檔案,造成之後 Revert(退回)過於困難。
加入 Controller
接下來要加入 Controller 讓我們可以順利開啟這兩個頁面,其中 SubscriptionsController
的內容可能會讓你們覺得有點意外。
1class SubscriptionsController < ApplicationController
2 def index
3 render plain: '30 天後到期'
4 end
5
6 def create
7 redirect_to subscriptions_path
8 end
9end
如果我們這樣寫,測試會通過的嗎?現在可以保持疑問,我們繼續完成後再來揭曉答案。
1class PlansController < ApplicationController
2end
至於 PlansController
因為只是單純的表單,我們可以直接加入 View 來實現這件事情。
加入 View
在這個階段,我們加入 View 也只是方便製作表單,如果只需要顯示純文字的訊息,使用 render plain: '...'
的方式也是完全沒有問題的,因為我們關注的是「功能(Feature)」而不是介面(User Interface)
1<!-- app/views/plans/index.html.erb -->
2<%= form_with url: subscriptions_path, method: :post do |f| %>
3 <%= f.submit '訂閱' %>
4<% end %>
像這樣子,我們基本上就完成通過測試的必要條件,現在可以使用 bundle exec cucumber
命令,看看是否可以通過測試。
最後,測試順利通過,這也表示我們的 Key Examples(關鍵案例)雖然有意義,然而卻不足以完整的描述這個功能,也因此我們還需要加入更多的例子,直到這個功能具備我們所預期的一切機制。
如果對這篇文章有興趣,可以透過以下連結繼續閱讀這系列的其他文章。
- 前言 - Rails 開發實踐
- 將需求實現的準備 - Rails 開發實踐
- 獲取規格的技巧 - Rails 開發實踐
- 可以測試的規格 - Rails 開發實踐
- 快速通過測試的方法 - Rails 開發實踐
- 用測試完善規格 - Rails 開發實踐
- 資料跟資訊的差異 - Rails 開發實踐
- 用測試資料驗證邏輯 - Rails 開發實踐
- 預期外狀況的檢查 - Rails 開發實踐
- 預期外狀況的測試 - Rails 開發實踐
- 聚合多筆資料 - Rails 開發實踐
- 重構與修正邏輯 - Rails 開發實踐
- 加入聚合實體 - Rails 開發實踐
- 持久化資料 - Rails 開發實踐
- 實體與倉庫 - Rails 開發實踐
- 聚合與邊界 - Rails 開發實踐
- 使用案例與服務 - Rails 開發實踐
- 結語 - Rails 開發實踐