Rspec & devise test helpers
В соответствии с этим из викторины разработки я должен иметь возможность использовать вспомогательный метод 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
Может ли кто-то указать на то, где я ошибаюсь. С этой точки зрения работает тестовый набор. Я получаю локальное сообщение переменной или метода undefined, поэтому я думаю, что модуль не включается.
Rails 3.0.7
rspec 2.6.0
разработать 1.3.4
backtrace
Ответы
Ответ 1
Я предполагаю, что существует пара проблем с этим подходом. Во-первых, вы используете спецификации запросов, а не спецификации контроллера, поэтому метод login_user
недоступен config.extend ControllerMacros, :type => :controller
. Во-вторых, даже если вы можете включить метод, который, скорее всего, не будет работать, так как тестовые помощники Devise специально написаны для тестов контроллера/просмотра, а не для тестов интеграции.
Взгляните на David Chelimsky ответ на этот вопрос SO, который может быть полезен.
Ответ 2
Я не могу точно ответить... но запах кода для меня - это "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
... выглядит довольно похоже на меня.
Ответ 3
У меня такая же проблема с Rails 3.0.10 rspec 2.6.0 devise 1.3.4 spork-0.9.0.rc9 по моим спецификациям контроллера, я изменил config. extend
на config.include
и свою работу!
Ответ 4
Забудьте подтвердить, не подтверждено ли ваше приложение. Ваш код должен выглядеть как
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