2011-01-11 13 views
14

Mi código ayudante se parece a esto (y funciona bien por cierto):ayudantes de prueba en Rails 3 con Rspec 2 e idear

module ProvidersHelper 
    def call_to_review(provider) 
    if user_signed_in? && review = Review.find_by_provider_id_and_user_id(provider.id, current_user.id) 
     link_to "Edit Your Review", edit_provider_review_path(provider, review), :class => "call_to_review" 
    else 
     link_to "Review This Provider", new_provider_review_path(provider), :class => "call_to_review" 
    end 
    end 
end 

Desafortunadamente, esto produce el siguiente error cuando ejecuto mis pruebas:

undefined method `user_signed_in?' for #<ActionView::Base:0x00000106314640> 
# ./app/helpers/providers_helper.rb:3:in `call_to_review' 

Claramente, el Devise::Controllers::Helpers no se incluye en mis ayudantes cuando rspec está ejecutando la prueba. ¿Alguna sugerencia que pueda ayudar a este trabajo?

Editar: para proporcionar un poco más de información, mi spec_helper tiene esto:

config.include Devise::TestHelpers, :type => :controller 
config.include Devise::TestHelpers, :type => :view 
config.include Devise::TestHelpers, :type => :helper 

(Por desgracia, no pude conseguir que funcione con :type => [:controller, :view, :helper])

De todos modos creo que estas líneas agregue los sign_in(scope, object) (y otros) ayudantes de prueba a sus pruebas. No agregan los ayudantes que realmente aprovecharías en tu código de controlador/vista.

+0

Estoy teniendo este problema también.Estoy muy interesado en la respuesta. Cosas como 'current_user' no existen cuando ejecuto la prueba. Probablemente sea el mismo problema que estás teniendo. Esta es la única cosa que no me gusta de los lenguajes dinámicos: a veces hay una gran cantidad de metaprogramación y 'magia' en marcha ... y no tienes idea de lo que necesitas llamar para obtener el resultado deseado ... para que finalices desperdiciando una hora buscando el método para llamar para hacer una prueba, derrotando los beneficios de productividad de usar el lenguaje dinámico en primer lugar:/ – egervari

+0

Aquí hay otro ejemplo de este problema: NameError: variable o método local indefinido 'current_user 'for # egervari

+0

Comencé una recompensa por su pregunta. Espero que la persona que responde también resuelva mi problema al mismo tiempo. – egervari

Respuesta

12

Creo que la filosofía de rspec es probar la vista/ayudantes/modelos en total aislamiento tanto como sea posible. Entonces, en este caso, anularía el user_signed_in? y devolvería false o true y mis resultados deberían cambiar apropiadamente. Esto le proporciona una prueba limpia y aislada.

+0

Esta es prácticamente la única respuesta que podría venir con ... pero ¿por qué funciona esto para los controladores? Si Rspec quiere que restemos esto ... entonces ¿por qué se les proporcionan pruebas de controlador pero no ayudantes? ¿Esto solo es un error?:/ – egervari

+0

Se pueden usar controladores para las pruebas de integración, así que por eso (supongo) es posible un ciclo más completo. Por lo tanto, en las pruebas del controlador, incluyo el 'Devise :: TestHelpers' y simplemente funciona. Dentro de las especificaciones de tu controlador, también puedes renderizar las vistas (w En general, no lo hago, la mayoría de las veces tiendo a anular el acceso a ActiveRecord, así que las vistas/ayudantes/... deberían funcionar allí. – nathanvda

+6

¿Cómo hace un stub esto en una especificación auxiliar? Las pocas variaciones que cansé no funcionaron. ¿Los talones van en un bloque anterior? ¿Los eliminas del objeto auxiliar? –

1

¿Está incluyendo actualmente los auxiliares de prueba como se sugiere en el wiki?

# spec_helper.rb: 
RSpec.configure do |config| 
    config.include Devise::TestHelpers, :type => :controller 
end 

type sería probablemente helper en su caso.

+0

Sí, lo siento, olvidé mencionar eso. Desde mi 'spec_helper.rb':' config.include Devise :: TestHelpers,: type =>: helper' – steve

+0

No creo que esto lo solucione. Estoy teniendo el mismo problema. El problema es que las referencias a 'current_user' y similares dentro del helper aún no existen cuando ejecuta la prueba. – egervari

0

¿Quizás intente poner esto en un bloque anterior?

@request.env["devise.mapping"] = :user 
+0

Eso no tiene ningún efecto para mí :(Trate de hacer una prueba de ayuda donde un método de ayuda solo devuelve "usuario_actual". Si puede hacer pasar esta prueba, estoy seguro de que resolvería mi problema y su problema. No me puedo imaginar – egervari

+3

agregando 'def current_user {@user} parece resolver mi problema, pero parece un tanto redundante burlarse de los métodos que se supone que debe proporcionar en su nombre:/ – egervari

0

Esto no se ha resuelto a mi satisfacción y probablemente nunca lo será. Creo que la mejor solución por ahora es resguardar manualmente helper.current_user y cualquier otro método Devise que utilice en el método de ayuda que está probando.

Sí, Devise proporciona estas instalaciones de conexión para controlar y ver las especificaciones. Sospecho que es algo sobre la combinación de Devise/Rails/Test :: Unit/Rspec que demuestra que esto es difícil para las especificaciones de ayuda.

0

mi prueba de ayuda utiliza Devise y cancan y funciona sin tropezar nada (pero no estoy seguro si es mejor trocear todo).

Aquí está la esencia: https://gist.github.com/shotty01/5317463 también intenté agregar user_signed_in? en el método de ayuda y todavía estaba bien.

se requiere lo siguiente:

add to spec_helper.rb: 
config.include Devise::TestHelpers, :type => :helper 

mi especificación gemas:

rspec (2.10.0) 
rspec-core (2.10.1) 
rspec-expectations (2.10.0) 
rspec-mocks (2.10.1) 
rspec-rails (2.10.1) 

por supuesto, puede iniciar sesión sin Factory Girl, sólo hay que reescribir los métodos ValidUserHelper para crear un usuario directamente o de accesorios.

Cuestiones relacionadas