ruby-on-rails - tests - rspec rails tutorial
rspec y diseƱar ayudantes de prueba (4)
No puedo responder con certeza ... pero el olor del código para mí es el "antes (: cada)" definido dentro del ayudante. ¿Por qué no lo intentas?
#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
y
#requests/some_spec.rb
require ''spec_helper''
describe "GET /guides/edit" do
before(:each) do
login_user
end
end
y si eso falla, tal vez simplemente no puede encontrar @request, en cuyo caso, páselo como una variable para login_user
Editar:
Parece que podrías necesitar incluir a los ayudantes de prueba. El rdoc dice que deberías tener este archivo:
# spec/support/devise.rb
RSpec.configure do |config|
config.include Devise::TestHelpers, :type => :controller
end
No estoy seguro de si eso difiere de cómo lo conseguiste en spec_helper.rb ... parece bastante similar a mí.
De acuerdo con esto, desde la wiki de diseño, debería ser capaz de usar un método de ayuda de login_user en mis pruebas de controlador. En consecuencia, tengo lo siguiente dentro del directorio de especificaciones:
#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
...
y
#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
sin embargo, llamar al ayudante no funciona:
#requests/some_spec.rb
require ''spec_helper''
describe "GET /guides/edit" do
login_user
end
¿Puede alguien señalar hacia dónde me estoy equivocando? El conjunto de pruebas funciona a partir de esto. Obtengo un mensaje de variable o método local indefinido, así que supongo que el módulo no se incluye.
Rails 3.0.7 rspec 2.6.0 idear 1.3.4
Tengo el mismo problema con Rails 3.0.10 rspec 2.6.0 idee 1.3.4 spork-0.9.0.rc9 en las especificaciones de mi controlador, he cambiado config. extend
config. extend
a config.include
y su trabajo!
Olvide confirmar si su aplicación no es confirmable. Tu código debería verse como
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
Me imagino que hay un par de problemas con este enfoque. Lo primero es que está utilizando las especificaciones de solicitud, no las especificaciones del controlador, por lo que el método login_user
no está disponible en config.extend ControllerMacros, :type => :controller
. En segundo lugar, incluso si puede incluir el método, lo más probable es que no funcione, ya que los ayudantes de prueba de Devise se escriben específicamente para pruebas de control / vista, no pruebas de integración.
Eche un vistazo a la respuesta de David Chelimsky a esta pregunta SO , que puede ser de ayuda.