私は実際にRSpecを使ってテストを書いています。次のコードは にありspec/requests/tasks_spec.rb
ます。
require 'spec_helper'
describe "Tasks" do
env_headers = {'HTTP_ACCEPT' => Mime::JSON, "devise.mapping" => Devise.mappings[:user] }
describe "GET /tasks" do
context "with valid credentials" do
user = FactoryGirl.build(:user)
authorization_header = ActionController::HttpAuthentication::Basic.encode_credentials(user.authentication_token, nil)
env_headers['HTTP_AUTHORIZATION'] = authorization_header
it "should succeed" do
get '/tasks', nil, env_headers
response.status.should eq(200)
end
end
context "with invalid credentials" do
authorization_header = ActionController::HttpAuthentication::Basic.encode_credentials("123456", nil)
env_headers['HTTP_AUTHORIZATION'] = authorization_header
it "should fail" do
get '/tasks', nil, env_headers
response.status.should eq(401)
end
end
end
end
GET (ただし、PUT、DELETE など) のテストだけでなく、ユーザーのインスタンス化に関するコードの繰り返しを避けたいと考えています。実際にコンテキストの外に移動すると、スコープの問題により変数user = FactoryGirl.build(:user)
にアクセスできなくなります。user
このユーザーを各コンテキストで実際に再利用可能にするためのベスト プラクティスが RSpec にあるかどうかを知りたいです。
さらに、(私の場合)のような特定のコンテキストでのみ使用できるようにすることができる場合はオプションですが、(コンテキスト
context "with valid credentials"
にユーザーは必要ないためwith invalid credentials
)。
アップデート :
let を使用すると、まだスコープの問題が発生していましたが、それは愚かな間違いによるものでした。it ブロック外のユーザーを求めていました。次のコードは問題ありません。
describe "Tasks" do
let(:user) { FactoryGirl.build(:user) }
describe "GET /tasks" do
context "with valid credentials" do
it "should succeed" do
authorization_header = ActionController::HttpAuthentication::Basic.encode_credentials(user.authentication_token, nil)
env_headers['HTTP_AUTHORIZATION'] = authorization_header
get '/tasks', nil, env_headers
response.status.should eq(200)
end
end