---
title: "快速通過測試的方法 - Rails 開發實踐"
date: 2023-08-04T00:00:00+08:00
publishDate: 2023-08-04T00:00:00+08:00
lastmod: 2023-09-03T17:33:12+08:00
tags: ["測試","經驗","心得","Rails","Rails 開發實踐"]
series: "rails-in-practice"
toc: true
permalink: "https://blog.aotoki.me/posts/2023/08/04/rails-in-practice-the-fast-way-to-pass-test/"
language: "zh-tw"
---


通過規格的分析我們準備好了 E2E Testing 的文件，以及對應的步驟實現，然而在這個狀態下是無法順利通過測試的，因此我們需要進行一些實作。在只有一條測試的狀況下，我們可以用非常簡單的方法通過這個測試。

<!--more-->

## 加入路由{#add-route}

實踐 E2E Testing 的方式最直覺的做法就是「由外而內」對使用者來說開啟某個頁面是透過點選特定選單進行的，因此我們需要先加入一個路由來實現「我打開訂閱頁面」這個動作。

> 在前面的例子中，我們的步驟都是直接呼叫 `visit` 方法來進行，更好的做法是從首頁作為起點，以連續的動作進行，這樣才可以測出無法到達的頁面。

```ruby
Rails.application.routes.draw do
  # ...
  root to: 'plans#index'
  resources :plans, only: %i[index]
  resources :subscriptions, only: %i[index create]
end
```

我們先將 `/plans` 和 `/subscriptions` 加入，實際上實作的時候也可以分開加入，控制最小的步驟也是確保每個 Commit（提交）不會一口氣修改過多的檔案，造成之後 Revert（退回）過於困難。

## 加入 Controller{#add-controller}

接下來要加入 Controller 讓我們可以順利開啟這兩個頁面，其中 `SubscriptionsController` 的內容可能會讓你們覺得有點意外。

```ruby
class SubscriptionsController < ApplicationController
  def index
    render plain: '30 天後到期'
  end

  def create
    redirect_to subscriptions_path
  end
end
```

如果我們這樣寫，測試會通過的嗎？現在可以保持疑問，我們繼續完成後再來揭曉答案。

```ruby
class PlansController < ApplicationController
end
```

至於 `PlansController` 因為只是單純的表單，我們可以直接加入 View 來實現這件事情。

## 加入 View{#add-view}

在這個階段，我們加入 View 也只是方便製作表單，如果只需要顯示純文字的訊息，使用 `render plain: '...'` 的方式也是完全沒有問題的，因為我們關注的是「功能（Feature）」而不是介面（User Interface）

```html
<!-- app/views/plans/index.html.erb -->
<%= form_with url: subscriptions_path, method: :post do |f| %>
  <%= f.submit '訂閱' %>
<% end %>
```

像這樣子，我們基本上就完成通過測試的必要條件，現在可以使用 `bundle exec cucumber` 命令，看看是否可以通過測試。

最後，測試順利通過，這也表示我們的 Key Examples（關鍵案例）雖然有意義，然而卻不足以完整的描述這個功能，也因此我們還需要加入更多的例子，直到這個功能具備我們所預期的一切機制。

