2013-05-02 2 views
4

Rails новичок. Попытка следовать учебнику Майкла Хартла.Rails: RSpec - undefined метод `cookie_jar 'для nil: NilClass

Застрял пытается добавить вспомогательный метод для моделирования журнала в тесте 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 

В моей спецификации/поддержки/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)>' 
+1

ссылка на учебник? Направьте строку с ошибкой? – fotanus

+0

ошибка находится на 'cookies [: remember_token] = user.remember_token'. Учебник: http://ruby.railstutorial.org/chapters/updating-showing-and-deleting-users#top –

+0

Можете ли вы опубликовать полную трассировку стека, пожалуйста? – hlh

ответ

3

RSpec очень относится к каталогу, в котором вы размещаете свои тесты. Если вы поместите тест в неправильный каталог, он не будет автоматически смешивать различные тестовые помощники, которые устанавливают различные типы тестов. Кажется, что ваша установка использует spec/features, который не является официальным default directory (spec/requests, spec/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 

Include это в вашем файле 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' в верхней O е файла спецификации и что ваш фактический spec/spec_helper.rb файл имеет require 'rspec/rails'

минорной ноте, вам не нужно ставить specify внутри из 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 или непосредственно в тестовый файл.

Однако, глядя на source, я не видел, где они автоматически включают этот каталог. Вы также можете попробовать добавить тег type: :feature к внешнему блоку describe в тестовом файле. Хотя наиболее вероятным решением является использование spec/requests.

+0

Большое спасибо, застряли на этом в течение нескольких дней. –

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 
+0

Не думал, что вам нужно в Ruby? Я ноб, хотя так скажи мне, если иначе. Однако проблема не устранена. –

+0

Я тоже новый. Поиск вокруг, я не видел этого нигде как «правильного» синтаксиса. –

+1

Это необязательно, оба пользователя 'def log_in user' и' def log_in (user) 'действительны. Однако типичным соглашением является использование parens для определения метода. –

0

Чтобы иметь макет куков, вы должны быть либо rack-test или rspec-rails камень включены в Gemfile. Я думаю, может быть, вы включили только rspec и, возможно, пропустили rspec-rails.

Вы также должны убедиться, что вы настроили магазин сеанса следующим образом:

config.session_store = :cookie_store

Это должно быть сделано в любом config/application.rb или какой-либо файл под config/initializers. Если вы настроили это в config/environments/development.rb или где-то еще, тестовая среда не сможет его поднять.

+0

Спасибо, но эта настройка уже установлена ​​во всех средах, и я уже использую драгоценный камень spec-rails. Проблема все еще остается. –

Смежные вопросы