помощники по тестированию rspec и devise

Согласно это из вики по разработке я должен иметь возможность использовать вспомогательный метод login_user в своих тестах контроллера. Соответственно, в каталоге спецификаций у меня есть следующее:

#spec_helper.rb
...
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}

RSpec.configure do |config|
  config.include Devise::TestHelpers, :type => :controller
  config.extend ControllerMacros, :type => :controller
...

и

#support/controller_macros.rb
module ControllerMacros    
  def login_user
    before(:each) do
      @request.env["devise.mapping"] = Devise.mappings[:user]
      @user = Factory.create(:user)
      sign_in @user
    end
  end
end

однако вызов помощника не работает:

#requests/some_spec.rb
require 'spec_helper'
describe "GET /guides/edit" do
  login_user     
end

Может кто-нибудь указать, где я ошибаюсь. Набор тестов работает примерно на этом. Я получаю неопределенную локальную переменную или сообщение о методе, поэтому я предполагаю, что модуль не включается.

Rails 3.0.7 rspec 2.6.0 разработка 1.3.4

обратная трассировка


person mark    schedule 19.06.2011    source источник
comment
Это опечатка в вашем файле some_spec.rb? log_in / login_user   -  person Dogbert    schedule 19.06.2011
comment
Какую обратную связь вы получаете?   -  person Taryn East    schedule 19.06.2011
comment
Привет. Добавили в основу вопроса.   -  person mark    schedule 19.06.2011
comment
подождите - эта обратная трассировка говорит, что не может найти ваш метод login_user. Я не знаю, что такое controller_macros.rb... но как насчет того, чтобы просто попытаться поместить это прямо в spec_helper.rb, чтобы увидеть, действительно ли работает login_user... а затем выяснить, как включить ControllerMacros, чтобы он мог найти вашего помощника. метод.   -  person Taryn East    schedule 19.06.2011


Ответы (4)


Я предполагаю, что есть несколько проблем с этим подходом. Во-первых, вы используете спецификации запроса, а не спецификации контроллера, поэтому метод login_user недоступен для config.extend ControllerMacros, :type => :controller. Во-вторых, даже если вы сможете включить метод, он, скорее всего, все равно не будет работать, поскольку тестовые помощники Devise специально написаны для тестов контроллера/представления, а не для интеграционных тестов.

Взгляните на ответ Дэвида Челимского на этот вопрос SO, который может помочь.

person zetetic    schedule 19.06.2011
comment
Спасибо zetetic. Вы совершенно правы, я перепутал контроллер и спецификации запроса. Связанный ответ работает отлично. - person mark; 19.06.2011
comment
Как выйти из сеанса, вошедшего в систему, в спецификациях. - person aashish; 28.10.2014

Я не могу точно ответить... но запах кода для меня - это "до (: каждый)", определенный внутри помощника. почему бы тебе не попробовать:

#support/controller_macros.rb
module ControllerMacros    
  def login_user
    @request.env["devise.mapping"] = Devise.mappings[:user]
    @user = Factory.create(:user)
    sign_in @user
  end
end

и

#requests/some_spec.rb
require 'spec_helper'
describe "GET /guides/edit" do
  before(:each) do
    login_user     
  end
end

и если это не удается - возможно, он просто не может найти @request - в этом случае передайте его как переменную в login_user

Редактировать:

Похоже, вам может понадобиться включить помощников по тестированию разработки. rdoc говорит, что у вас должен быть этот файл:

# spec/support/devise.rb
RSpec.configure do |config|
  config.include Devise::TestHelpers, :type => :controller
end

Не уверен, что это отличается от того, что вы уже получили в spec_helper.rb... мне очень похоже.

person Taryn East    schedule 19.06.2011
comment
Спасибо за Ваш ответ. Я попробовал это, но это всегда отсутствующая переменная/ошибка метода, которая, кажется, предполагает, что модуль вообще не включен. - person mark; 19.06.2011
comment
Хм, извините, я использую его с Test::Unit (хотя я использую rspec в другом проекте), так что я только предполагаю... Возможно, вы могли бы потребовать 'devise' в spec_helper.rb ? - person Taryn East; 19.06.2011
comment
Привет Тарин. Спасибо за ваш совет, но похоже, что я перепутал спецификации контроллера и спецификации запроса. - person mark; 19.06.2011

У меня такая же проблема с Rails 3.0.10 rspec 2.6.0 devise 1.3.4 spork-0.9.0.rc9 в спецификациях моего контроллера, я изменил config. extend на config.include и все заработало!

person Joel AZEMAR    schedule 08.09.2011

Забудьте подтвердить, если ваше приложение не подтверждается. Ваш код должен выглядеть так

module ControllerMacros
  def login_user
    before(:each) do
      @request.env["devise.mapping"] = Devise.mappings[:user]
      user = FactoryGirl.create(:user)
      #user.confirm! # or set a confirmed_at inside the factory. Only necessary if you are using the confirmable module
      sign_in user
    end
  end
end
person ndrx42    schedule 25.05.2012