2012-02-07 22 views
9

He pensado en utilizar Rspec. Pero tengo un próximo problema con assert_select.Rails 3 RSpec y assert_select

1) UserController login page open login page contains all expected controls 
Failure/Error: assert_select "form[action=?]", "/user/login" do MiniTest::Assertion: 
Expected at least 1 element matching "form[action='/user/login']", found 0. 
# (eval):2:in `assert' 
# ./spec/controllers/user_controller_spec.rb:20:in `block (3 levels) in <top (required)>' 

Ésta es mi fragmento de código

describe UserController do 
    describe "login page open" do 
    it "login page contains all expected controls" do 
     get :login 
     assert_select "form[action=?]", "/user/login" do 
     assert_select "input[name=?]", "username" 
     assert_select "input[name=?]", "password" 
     assert_select "input[type=?]", "submit" 
    end 
    end 
end 

Al abrir una página de inicio de sesión en un navegador esta página se abre sin problema.

+0

¿por qué tiene un error 'MiniTest :: Assertion' cuando usa RSpec? ¡Supongo que hay algo mal en tu configuración de RSpec! – phoet

+0

Creo que también. Pero hice todo por esta [instrucción] (http://rubydoc.info/gems/rspec-rails/frames) – starter

+0

¿cómo se ve tu 'spec/spec_helper.rb'? ¿Intentó ejecutar su especificación con el comando 'rspec'? – phoet

Respuesta

15

De forma predeterminada, RSpec (al menos en las versiones más nuevas) evita que Rails represente las vistas cuando se ejecutan las especificaciones de las especificaciones del controlador. Quieren que pruebe sus vistas para ver las especificaciones, no las especificaciones del controlador. Como las vistas no se representan, assert_select siempre falla.

Pero para las personas que (como yo) quieren probar el fragmento ocasional de una vista en sus especificaciones de controlador, proporcionan un método render_views. Sin embargo, debe llamarlo en su bloque describe o context, no dentro del bloque it.

describe UserController do 

    render_views  # <== ADD THIS 

    describe "login page open" do 
    it "login page contains all expected controls" do 
     get :login 
     assert_select "form[action=?]", "/user/login" do 
     assert_select "input[name=?]", "username" 
     assert_select "input[name=?]", "password" 
     assert_select "input[type=?]", "submit" 
    end 
    end 
end 
1

Las pruebas del controlador son para probar los controladores.

assert_select coincide con algo que está en su código de vista.

Es una buena idea mantener sus controladores separados de sus puntos de vista, y esto incluye las pruebas realizadas en los controladores y en las vistas. Debe usar assert_select en su prueba de vistas (las que generalmente están en spec/views), no en las pruebas de su controlador.

Cuestiones relacionadas