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
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
'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
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