私はここ数年Railsで遊んでいて、本番環境にあるいくつかの無難なアプリを作成しました。私はいつもテストをすることを避けてきました、そして私はそれを修正することに決めました。私は、すでに稼働しているが絶えず改訂されている作業のために書いたアプリのいくつかのテストを書き込もうとしています。変更を加えると問題が発生するのではないかと心配しているので、いくつかのテストを実行してもらいたいと思います。私はRSpecの本を読み、いくつかのスクリーンキャストを見ましたが、始めるのに苦労しています(実際にそれを行った後でしか理解できないようなものだと思います)。
ReportsControllerの簡単なテストとなるものを書き込もうとしています。私のアプリの問題は、ほとんどすべてが認証レイヤーの背後にあることです。ログインしていない場合は何も機能しないため、単純なgetリクエストを送信する前に、ログインをシミュレートする必要があります(ただし、ログインなしでは何も機能しないことを確認するために、いくつかのテストを作成する必要があります。それは後で)。
RSpec、Capybara、FactoryGirl、Guardを使用してテスト環境をセットアップしました(どのツールを使用するかわからなかったため、Railscastの提案を使用しました)。これまでテストを作成してきた方法は、FactoryGirlでそのようなユーザーを作成することです。
FactoryGirl.define do
sequence(:email) {|n| "user#{n}@example.com"}
sequence(:login) {|n| "user#{n}"}
factory :user do
email {FactoryGirl.generate :email}
login {FactoryGirl.generate :login}
password "abc"
admin false
first_name "Bob"
last_name "Bobson"
end
end
そして、そのように私のテストを書きます。
require 'spec_helper'
describe ReportsController do
describe "GET 'index'" do
it "should be successful" do
user = Factory(:user)
visit login_path
fill_in "login", :with => user.login
fill_in "password", :with => user.password
click_button "Log in"
get 'index'
response.should be_success
end
end
end
これはそのように失敗します。
1) ReportsController GET 'index' should be successful
Failure/Error: response.should be_success
expected success? to return true, got false
# ./spec/controllers/reports_controller_spec.rb:13:in `block (3 levels) in <top (required)>'
興味深いことに、テストをに変更すると、テストにresponse.should be_redirect
合格します。これは、その時点まですべてが機能しているが、ログインが認識されていないことを示しています。
だから私の質問は、このログインを機能させるために何をしなければならないかということです。FactoryGirlクレデンシャルに一致するユーザーをデータベースに作成する必要がありますか?もしそうなら、ここでのFactoryGirlのポイントは何ですか(そして私もそれを使用する必要があります)?テスト環境でこの偽のユーザーを作成するにはどうすればよいですか?私の認証システムは非常に単純な自作のシステムです(Railscastsエピソード250に基づく)。このログイン動作は、おそらくほとんどすべてのテストで複製する必要があるので、コードで一度実行して、どこにでも適用するにはどうすればよいですか?
これは大きな質問だと思いますので、ご覧いただきありがとうございます。