Prueba de integración de inicio de sesión con rspec/devise

Tengo problemas para realizar una prueba de integración, para que el usuario inicie sesión en mi aplicación Rails, pase.

Estoy usando Rspec y carpincho, así como un dispositivo para la autenticación de usuarios.

Aquí está mi código:

solicitudes/autenticaciones_spec.rb

describe 'log in' do
  before { visit root_path }
  subject { page }

  describe 'should be able to log in' do
    before do
      user = FactoryGirl.create(:user)
      fill_in :user_email, with: user.email
      fill_in :user_password, with: user.password
      click_on 'Log in'
    end
    it { should have_link 'Log out' }
  end
end

fábricas/user_factory.rb

FactoryGirl.define do
  factory :user do
    sequence( :first_name )  { |n| "FirstName#{n}" }
    sequence( :last_name )  { |n| "LastName#{n}" }
    sequence( :email ) { |n| "foo#{n}@example.com" }
    password              'foobar'
    password_confirmation 'foobar'
    created_at            Time.now
    updated_at            Time.now
  end
end

_login_form.html.erb, este formulario se representa en el encabezado de diseño de la aplicación.

<%= form_for(resource, as: resource_name, url: session_path(resource_name), html: { id: 'login-mini-form' }) do |f| %>
  <%= f.email_field :email,       placeholder: 'Your email' %>
  <%= f.password_field :password, placeholder: '******' %>
  <%= f.submit "Log in", id: 'login-button' %>

  <%- if devise_mapping.rememberable? -%>
    <%= f.check_box :remember_me %> <%= f.label :remember_me %>
  <%- end -%>

<% end %>

En el diseño tengo algo así:

if user_signed_in?
  render 'devise/menu/logout_button'
else
  render 'devise/menu/login_form'
end

la prueba me esta dando

1) User should be able to log in with valid credentials 
     Failure/Error: it { should have_link 'Log out' }
       expected link "Log out" to return something
     # ./spec/requests/authentications_spec.rb:117:in `block (6 levels) in <top (required)>'

Finished in 0.71406 seconds
8 examples, 2 failures, 2 pending

No entiendo por qué mi prueba no está pasando. Algunas ideas ?

¡Muchas gracias!

Editar: obtengo el mismo comportamiento probando el registro con: expect { click_button register_button }.to change(User, :count).by 1, la prueba devuelve:

Failure/Error: expect { click_button register_button }.to change(User, :count).by 1
       count should have been changed by 1, but was changed by 0

preguntado el 04 de julio de 12 a las 00:07

¿Podríamos tener la salida completa de RSpec, por favor? -

He editado mi publicación de apertura :) -

¿Puedes comprobar el registro? Controlar log/test.log por cualquier error evidente. -

He puesto el registro en una esencia: gist.github.com/3046442, sin embargo, parece que no hay nada de malo en ello. También agregué algunas otras piezas de código en la esencia, si puede ayudar. -

2 Respuestas

Entonces, he encontrado lo que no funcionaba:

describe 'log in' do
  before { visit root_path }
  subject { page }

  describe 'should be able to log in' do
    before do
      user = FactoryGirl.create(:user)
      fill_in :user_email, with: user.email
      fill_in :user_password, with: user.password
      click_on 'Log in'
    end
    it { should have_link 'Log out' }
  end

El código correcto es de hecho:

describe 'log in' do
  before { visit root_path }
    subject { page }

    describe 'should be able to log in' do
      before do
        user = FactoryGirl.create(:user)
        fill_in 'user_email', with: user.email
        fill_in 'user_password', with: user.password
        click_on 'Log in'
      end
      it { should have_link 'Log out' }
    end
  end
end

Parece que el método Capybara fill_in no toma un símbolo como argumento para los identificadores, sino solo cadenas. Tonto de mí.

Respondido 04 Jul 12, 12:07

No proporcionó un tema para su expectativa, por lo que parece que RSpec está usando el resultado de la última expresión. Esa última expresión es tu click_button, que no devuelve nada. no puedes llamar should en nada.

Para solucionar esto, solo necesita especificar que la página debe tener dicho enlace. Uso Capybara y Selenium-Webdriver, por lo que para mí se vería como page.should have_link.... Mi RSpec-fu no es lo suficientemente fuerte como para saber si debe usar page también, o sustituir response, session, o algo mas.

Respondido 04 Jul 12, 00:07

No, ya que @paperwork ha declarado el subject, rspec usará eso. - nathanvda

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.