Writing tests for application code is something to have familiar to do, regardless of language or framework of choice. RSpec は Ruby で構築された素晴らしいテストスイートと DSL (Domain-Specific Language) で、定義済みのメソッドのセットを使って簡単にユニットテストを書くことができます。 私がRubyでコードを書くようになったのは、書いたものをテストするためにRSpecを熱心に実行した経験と密接に結びついています。したがって、Railsを学び始めたとき、RSpecを使い続けることは、より自然でシームレスな移行となりました。 RailsはデフォルトでMiniTestというテストフレームワークを使用しています。 ここでは、RSpecを使用するための新しいRailsプロジェクトのセットアップ方法を説明し、Capybaraを使用してビューをテストする方法を探ります。
まず、rails new NAME -T -B
を実行して新しいRailsプロジェクトを作成します。 -T
フラグは、Railsがこの新しいプロジェクトにテスト用フレームワークを設定しないように指定するもので、これはまさに私たちが望むものです。 -B
フラグは、この時点でbundle install
の実行をスキップするようにRailsに指示します。 次に、Gemfileを編集して次の内容を含める必要があります:
group :development, :test do
gem 'rspec-rails'
gem 'capybara'
end
これにより、RSpecとCapybaraの両方が開発環境とテスト環境に追加されます。 この時点で、bundle
を実行して、gems とプロジェクトに必要な依存関係をインストールします。 私は、この時点で rails console
を実行して、すべてが機能していることを確認し、機能していない場合は Gemfile に戻って問題を修正するのが好きです。 この時点で rails generate rspec:install
を実行し、spec
ディレクトリと必要なファイル構造を作成します。 最後のステップは、テストがCapybaraを使用するように指示することです。 spec/rails_helper.rb
に以下を追加します:
require 'capybara/rspec'
セットアップは以上です! これ以上進む前に、プロジェクトに加えた変更をコミットしましょう。 git add . && git commit -m "initial commit"
. コントローラを作成して、テストを行いましょう!
テスト目的で、いくつかの入力で簡単なフォームを作って、いくつかのサンプルデータに記入してフォームを提出するよう Capybara に指示することにしましょう。 複雑なモデルの作成やデータベースへの情報の永続化については心配しません。
rails generate controller Users new --no-helper --no-assets --no-view-specs
--no-helper --no-assets
を指定することで、Railsにコントローラ用のアセットやヘルパーを作成しないように指示します。 --no-view-specs
オプションは、ジェネレータにビューのテストを作成しないように指示しています。 Railsはnew
ルートを作成しました。config/routes.rb
:
Rails.application.routes.draw do
get 'users/new'
end
そしてapp/controllers/users_controller.rb
:
class UsersController < ApplicationController
def new
end
end
最後に、Railsはapp/views/users/new.html.erb
にビューを作成しました。 このビューを編集して、シンプルなフォームを作成しましょう:
<h1>User Login</h1>
<%= form_tag users_path do %>
<%= label_tag :name %>
<%= text_field_tag :name %>
<%= submit_tag "submit" %>
<% end %>
この配線を完成させるために、いくつかのことを行う必要があります。 routes.rb
に以下を追加します:
post 'users' => 'users#welcome'
また、users_controller.rb
に welcome
アクションを追加する必要があります:
def welcome
@user = params
render :welcome
end
ここで最後のステップは views/users/welcome.html.erb
を作成して、ユーザーの名前を表示するためのいくつかの HTML と ERB を含むことです:
<h1><%= "Welcome, #{@user}!" %></h1>
ふぅ~! rails server
を実行し、ブラウザで localhost:3000/users/new
にアクセスすると、名前を入力するように求めるフォームが表示されるはずです。 名前を入力して送信ボタンを押すと、暖かく迎えてくれるページにリダイレクトされるはずです。 しかし、新しいフォームを追加したり、新しい機能を実装したりするたびに、この方法でコードをテストしなければならず、すぐに面倒になってしまいます。 幸い、このプロセスをテストし自動化するツールが作成されました!
そこで登場したのが Capybara です。 Capybara は、フォーム データを入力し、ページ コンテンツを検査し、ブラウザに HTTP リクエストを送信することにより、ビュー内のコードをテストすることができるフレームワークです。
rails generate rspec:feature form
これはspec/features/form_spec.rb
というファイルを生成します。 デフォルトでは、Capybaraはfeatures
というディレクトリにspecがあることを想定しています。 このファイルを編集して新しいテストを追加し、name
テキストフィールドの入力を埋めて送信を押してみましょう:
require 'rails_helper'RSpec.feature "Forms", type: :feature do
it 'can enter a name and receive a greeting' do
visit 'users/new'
fill_in :name, with: "Capybara"
click_on 'submit'
expect(page).to have_content "Welcome, Capybara!"
end
end
以上です! これでRSpecとCapybaraを使ってRailsで最初のテストを作成することに成功しました。 rspec --format documentation
を実行すると、テストがパスしていることが確認できるはずです。 このテストを失敗させるにはどうしたらいいか、自由に試してみてください。 この例で作成できる他のテストはありますか? これらのツールを使用して、コードのテスト プロセスをどのように単純化および自動化できるかについて考え、コードを頻繁にテストする習慣を身に付けていただければと思います。