rspec & разработать помощников по тестированию - PullRequest
18 голосов
/ 19 июня 2011

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

#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

трассировка

Ответы [ 4 ]

18 голосов
/ 19 июня 2011

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

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

4 голосов
/ 19 июня 2011

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

#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

Edit:

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

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

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

0 голосов
/ 25 мая 2012

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

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
0 голосов
/ 08 сентября 2011

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

...