蒼時弦也
蒼時弦也
資深軟體工程師
發表於

快速通過測試的方法 - Rails 開發實踐

這篇文章是 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(關鍵案例)雖然有意義,然而卻不足以完整的描述這個功能,也因此我們還需要加入更多的例子,直到這個功能具備我們所預期的一切機制。