0

私は実際に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

4

1 に答える 1