サンプルアプリ作成
$ rails new sample_app --skip-test-unit
$ cd sample_app
Test::UnitフレームワークではなくRspecを後で使うためデフォルトのテストは生成しないようにする。
Rspecを使うのに必要なライブラリをGemfileに記述
2つの新しいgemを使う。
- RSpecのためのgem
- rspec-rails
- RSpecのライブラリのためのgem
- Capybara
メモ
--without productionオプションを追加することで、本番環境のgemのみをインストールしないようにすることができます。注: このオプションは “remembered option” と呼ばれるもので、このオプションを一度実行するとコマンドに保存され、今後Bundlerを実行するときにオプションを追加する必要がなくなります。このため、今後は単にbundle installを実行するだけで、自動的に本番環境用gemをスキップできるようになります2。
秘密トークンを動的に生成する。
securerandomライブラリを読み込んでSecureRandom.hex(64)でscecret_tokenを自動生成する
config/initializers/secret_token.rb
require 'securerandom'
def secure_token
token_file = Rails.root.join('.secret')
if File.exist?(token_file)
# Use the existing token.
File.read(token_file).chomp
else
# Generate a new token and store it in token_file.
token = SecureRandom.hex(64)
File.write(token_file, token)
token
end
end
SampleApp::Application.config.secret_key_base = secure_token
RSpecを使うようにRailsの設定を変更
以下のコマンドを実行
$ rails generate rspec:install
静的ページの作成
アクション作成
- StaticPages
- Homeページ
- Helpページ
- Aboutページ
$ rails generate controller StaticPages home help --no-test-framework
静的ページ作成でテストは必要ないから--no-test-frameworkオプションを付けている。
テスト駆動開発
テスト駆動開発で最初に書く、失敗するテストのことを、一般的なテストツールでは「赤色 (Red)」と表現します (失敗時に表示が赤くなるツールが多いため)。同様に、次に書く、テストにパスするコードのことを「緑色 (Green)」と表現します。最後に、必要に応じてコードをリファクタリング (例えば、動作を変えずにコードを改善したり、冗長なコードを削除したりすること) します。このサイクルのことを「Red/Green/Refactor」と呼びます。
静的なページに対する結合テスト (request spec) を生成
$ rails generate integration_test static_pages
invoke rspec
create spec/requests/static_pages_spec.rb
RSpec はダブルクォート (") で囲まれた文字列を無視
visit '/static_pages/home'
上の行は、Capybaraのvisit機能を使って、ブラウザでの/static_pages/homeURLへのアクセスをシミュレーション。
expect(page).to have_content('Sample App')
次の行 (上のコード) では、これもCapybaraが提供するpage変数を使って、アクセスした結果のページに正しいコンテンツが表示されているかどうかをテスト
Rspecを実行するために
リスト3.10に示した1行を spec_helper.rbに追加する必要がある
spec_helper.rb
# This file is copied to spec/ when you run 'rails generate rspec:install'
.
.
.
RSpec.configure do |config|
.
.
.
config.include Capybara::DSL
end
テストの実行
$ bundle exec rspec spec/requests/static_pages_spec.rb