validates_presence_of rails example ruby-on-rails rspec authlogic rspec2 rspec-rails

ruby-on-rails - example - ruby on rails selenium



RSpec Rails Login Filter (2)

Hace poco cambié el uso de rspec-rails (2.6.1) con mi aplicación Rails (3.0.8). Estoy acostumbrado a Test :: Unit, y parece que no puedo obtener un filtro que funcione para mis métodos de prueba. Me gusta mantener las cosas lo más SECAS posible, así que me gustaría configurar un filtro al que pueda llamar en cualquier método de prueba que inicie sesión como usuario Authlogic antes de que se llame al método de prueba. Intenté lograr esto utilizando un filtro RSpec en spec_helper.rb:

config.before(:each, :login_as_admin => true) do post "/user_sessions/create", :user_session => {:username => "admin", :password => "admin"} end

Luego lo uso en el método de prueba correspondiente (en este caso spec / controllers / admin_controller_spec.rb):

require ''spec_helper'' describe AdminController do describe "GET index" do it("gives a 200 response when visited as an admin", :login_as_admin => true) do get :index response.code.should eq("200") end end end

Sin embargo, aparece este error cuando ejecuto la especificación rspec :

Failures: 1) AdminController GET index gives a 200 response when visited as an admin Failure/Error: Unable to find matching line from backtrace RuntimeError: @routes is nil: make sure you set it in your test''s setup method.

Blech. ¿Puedo enviar solo una solicitud HTTP por prueba? También traté de apagar mi método authenticate_admin (dentro del bloque config.before), sin suerte.


Deberías usar los macrones de shulda. Para usar debería modificar su spec_helper.rb

RSpec.configure do |config| config.include Clearance::Shoulda::Helpers end

Y luego puede configurar el filtro en la especificación del controlador como

require ''spec_helper'' describe AdminController do fixture :users before(:each) do sign_in_as users(:your_user) end describe "GET index" do it("gives a 200 response when visited as an admin", :login_as_admin => true) do get :index response.code.should eq("200") end end end


Desafortunadamente, no hay forma en este momento de hacer lo que estás tratando de hacer en un gancho before definido globalmente. La razón es que before que los ganchos se ejecuten en el orden en que se registran, y los declarados en RSpec.configure se registran antes de que rspec-rails registre internamente para configurar el controlador, la solicitud, la respuesta, etc.

Además, esto ha sido reportado a https://github.com/rspec/rspec-rails/issues/391 .