2012-05-26 7 views
6

Estoy siguiendo el tutorial de ROR de Michael y estoy creando un sistema de autenticación de usuario. Hay un administrador privilegiado, que permite a los usuarios eliminar a otros usuarios. Los enlaces especiales de "eliminación" aparecen en la página de la lista de usuarios cuando inician sesión como un usuario administrador privilegiado. Mi aplicación funciona bien pero las pruebas de rspec fallan por una razón desconocida para mí.Fallan las pruebas Rspec para enlaces administrativos 'eliminar'. Tutorial ROR 3.2 de Michael Hartl - Capítulo 9.4.2

He separado las pruebas en otro archivo spec/requests/sat_spec.rb y estoy tratando de usar la gema de palanca para depurarlo, pero hasta ahora no ha tenido éxito.

describe "delete links" do 
    describe "as admin user" do 
    let(:admin) { FactoryGirl.create(:admin) } 
    before do 
     sign_in admin 
     visit users_path 
     binding.pry   
    end 
    it { should have_link('delete', href: user_path(User.first)) } 

    it "should be able to delete another user" do 
    expect { click_link('delete') }.to change(User, :count).by(-1) 
    end  
end 

Fallos del test:

1) separated admin tests delete links as admin user 
Failure/Error: it { should have_link('delete', href: user_path(User.first)) } 
    expected link "delete" to return something 
# ./spec/requests/sat_spec.rb:25:in `block (4 levels) in <top (required)>' 

2) separated admin tests delete links as admin user should be able to delete another user 
Failure/Error: expect { click_link('delete') }.to change(User, :count).by(-1) 
Capybara::ElementNotFound: 
    no link with title, id or text 'delete' found 
# (eval):2:in `click_link' 
# ./spec/requests/sat_spec.rb:28:in `block (5 levels) in <top (required)>' 
# ./spec/requests/sat_spec.rb:28:in `block (4 levels) in <top (required)>' 

Lo que podría por el problema aquí o más importante la forma de depurarlo?

Puede desembolsar mi código aquí https://github.com/tomek-rusilko/miniatury_katalog_2

Respuesta

9

Espera que su página /users contenga la lista de usuarios con el enlace 'eliminar' junto a ellos. Pero no completó su TEST db con usuarios simples. Solo contiene un usuario, el administrador. Pero según su users/_user.html.erb este tipo de usuarios no tiene el enlace 'eliminar'. Por lo tanto, agregue al menos una declaración de creación de usuario y vuelva a intentarlo.

+0

Jeeez que era ¡tan obvio! Me siento estúpido: D Muchas gracias. Poniendo simple 'FactoryGirl.create (: user)' antes de resolver el problema. Hay otra cosa que surgió: ¿por qué 'FactoryGirl.create (: user)' funciona pero 'let (: user) {FactoryGirl.create (: user)}' no? – tomruss

+1

'let' se evalúa perezosamente: no se llamará a su bloque hasta que use' user' "variable". Use 'let!' (Con el signo de exclamación) en su lugar si desea que su bloque sea llamado inmediatamente. Pero le recomendaría poner su 'FactoryGirl.create (: user)' en el bloque 'before'. – jdoe

+0

Sí, eso es exactamente lo que hice: 'before (: all) {5.times {FactoryGirl.create (: user)}}; after (: all) {User.delete_all} '. Nuevamente, gracias por tu ayuda. – tomruss

0
let(:admin) { FactoryGirl.create(:admin) } 

Lo que está bien, ya que tienes (en spec/factories.rb)

factory :admin do 
    admin true 
end 

Pero mientras tanto, en modelos/usuario .rb:

attr_accessible :name, :email, :password, :password_confirmation 

Mi apuesta es que la chica de fábrica está utilizando la asignación masiva para establecer: admin => verdadero, que luego se descarta attr_accessible.

Pero más importante aún, ¿cómo lo depura? Al preguntar "¿qué está pasando?" y "¿qué espero que esté pasando?" y variaciones sobre el mismo hasta que encuentre que las respuestas a ambas preguntas se encuentran en el medio. En este caso, las preguntas con las que comenzaría son: ¿qué es lo que hace que se muestre el enlace? ¿Es eso cierto del modelo que configuré en la especificación? ¿Las especificaciones están llegando a las páginas que espero? ¿El modelo está actuando de la misma manera cuando llego a la página con el navegador que está en la especificación?

Pero todas esas son solo variaciones de "¿Qué está pasando?" y "¿Qué espero que esté pasando?"

+0

No sé exactamente cómo pero FactoryGirls se ocupa de ello y el atributo admin está configurado correctamente. Esa es otra pregunta interesante. De todos modos, este no fue el caso (ver más arriba), pero gracias por la ayuda y por los buenos consejos: estoy escribiendo estas preguntas de depuración y fijándolas en mi pared :) – tomruss

+0

Ok, es por diseño que las fábricas omiten attr_accessible – tomruss

Cuestiones relacionadas