4

レール初心者です。Michael Hartl のチュートリアルに従おうとしています。

RSpec テストでログをシミュレートするヘルパー メソッドを追加しようとしてスタックしました:

describe "when the a user has logged in and attempts to visit the page" do
    let(:user) { FactoryGirl.create :user }
    before do 
      log_in user
    end
    it "should redirect the user to next page" do
      specify { response.should redirect_to loggedin_path }
    end
  end

私のspec/support/utilities.rbでは:

def log_in user
    visit root_path
    fill_in "Email", with: user.email
    fill_in "Password", with: user.password
    click_button "Log in"
    cookies[:remember_token] = user.remember_token
end

エラー:

Failure/Error: log_in user
     NoMethodError:
       undefined method `cookie_jar' for nil:NilClass

何を与える?

編集、完全なスタック トレース:

Index page when the a user has logged in and attempts to visit the page should redirect the user to next page
     Failure/Error: log_in user
     NoMethodError:
       undefined method `cookie_jar' for nil:NilClass
     # ./spec/support/utilities.rb:8:in `log_in'
     # ./spec/features/pages/index_spec.rb:20:in `block (3 levels) in <top (required)>'
4

3 に答える 3

3

RSpec は、テストを配置するディレクトリに非常にこだわっています。テストを間違ったディレクトリに置くと、さまざまな種類のテストをセットアップするさまざまなテスト ヘルパーが自動的に混在することはありません。セットアップで使用spec/featuresされているのは、承認された既定のディレクトリ( spec/requestsspec/integration、またはspec/api) ではないようです。

spec_helper.rbチュートリアルページに基づいて、ファイルのセットアップ方法がわかりません。例はそうですがspec/requests、テストを保持するために使用しています。

次のいずれかを使用して、RSpec にリクエスト スペック用の別のディレクトリを強制的に認識させることができます。

適切なモジュールをテスト ファイルに手動で追加します。

# spec/features/pages/index_spec.rb
require 'spec_helper'

describe "Visiting the index page" do

  include RSpec::Rails::RequestExampleGroup

  # Rest of your test code
  context "when the a user has logged in and attempts to visit the page" do
    let(:user) { FactoryGirl.create :user }

    before do 
      log_in user
    end

    specify { response.should redirect_to loggedin_path }
  end

end

これをspec/spec_helper.rbファイルに含めます。

RSpec::configure do |c|
  c.include RSpec::Rails::RequestExampleGroup, type: :request, example_group: {
    file_path: c.escaped_path(%w[spec (features)])
  }
end

これはチュートリアルなのでrequire 'spec_helper'、仕様ファイルの先頭に含めるという標準に従うことをお勧めします。実際のspec/spec_helper.rbファイルにはrequire 'rspec/rails'

マイナーな注意として、ブロックのspecify中にa を入れる必要はありません。itこれらはお互いのエイリアスなので、いずれかを使用してください。

context "when the a user has logged in and attempts to visit the page" do
  let(:user) { FactoryGirl.create :user }

  before do 
    log_in user
  end

  # All of the following are the same

  it "redirects the user to next page" do
    response.should redirect_to loggedin_path
  end

  it { response.should redirect_to loggedin_path }

  specify "redirects the user to next page" do
    response.should redirect_to loggedin_path
  end

  specify { response.should redirect_to loggedin_path }
end

capybaraのドキュメントによると、カピバラのテストを に配置できるはずですspec/features。これを機能させるには、またはテスト仕様ファイルを直接ロードrequire 'capybara/rspec'していることを確認してください。spec_helper

ただし、ソースを見ると、そのディレクトリが自動的に含まれている場所がわかりませんでした。type: :featureテスト ファイルの外側のdescribeブロックにタグを追加することもできます。より可能性の高い解決策は、を使用することですがspec/requests

于 2013-05-06T20:27:10.707 に答える
0

メソッドの「ユーザー」引数を括弧で囲んではいけませんか?

def log_in(user)
    visit root_path
    fill_in "Email", with: user.email
    fill_in "Password", with: user.password
    click_button "Log in"
    cookies[:remember_token] = user.remember_token
end
于 2013-05-02T21:46:05.290 に答える
-1

モック クッキー ジャーを作成するには、rack-testまたはrspec-railsgem を .xml ファイルに含める必要がありますGemfile。たぶん、あなたは を含めただけrspecで、おそらく見逃したと思いますrspec-rails

また、次のようにセッション ストアを構成したことを確認する必要があります。

config.session_store = :cookie_store

これはconfig/application.rbconfig/initializers. これをconfig/environments/development.rbどこか他の場所で構成した場合、テスト環境はそれを取得できません。

于 2013-05-05T15:46:08.397 に答える