2012-07-08 36 views
5

Estoy trabajando en una especie de aplicación de respuestas de Yahoo para mejorar mis habilidades de Rails. Hasta ahora he fijado dos modelos "Pregunta" y "respuestas" y que se anidan de esta manera:Rspec and Rails con pruebas de vista y recursos anidados

resources :questions do 
    resources :answers 
    end 

He hecho pruebas para los controladores, modelos y vistas las preguntas, pero estoy tener un pequeño problema con la vista de las respuestas y las rutas anidadas. Estoy usando Rspec y Factory girl.

tengo la siguiente prueba:

describe "answers/new.html.erb" do 
    before(:each) do 
    @question = Factory(:valid_question) 
    @answer = Factory(:valid_answer) 
    assign(:question, @question) 
    assign(:answer, stub_model(Answer, 
     :text => "MyString", 
     :question_id => 1 
    ).as_new_record) 
    end 

    it "renders new answer form" do 
    render 
    assert_select "form", :action => question_answers_path(@question), :method => "post" do 
     assert_select "textarea#answer_text", :name => "answer[text]" 
     assert_select "input#answer_question_id", :name => "answer[question_id]" 
    end 
    end 
end 

y cada vez que ejecute la prueba de recibo el mensaje siguiente:

3) answers/new.html.erb renders new answer form 
    Failure/Error: render 
    ActionView::Template::Error: 
     No route matches {:controller=>"answers"} 
    # ./app/views/answers/new.html.erb:6:in `_app_views_answers_new_html_erb__3175854877830910784_6513500' 
    # ./spec/views/answers/new.html.erb_spec.rb:16:in `block (2 levels) in <top (required)>' 

He intentado muchas cosas como hacer

render new_question_answer_path(@question) 

pero obtengo esto:

3) answers/new.html.erb renders new answer form 
    Failure/Error: render new_question_answer_path(@question.id)#, :format=>:html 
    ActionView::MissingTemplate: 
     Missing partial /questions/1/answers/new with {:handlers=>[:erb, :builder, :coffee], :formats=>[:html, :text, :js, :css, :ics, :csv, :xml, :rss, :atom, :yaml, :multipart_form, : 
url_encoded_form, :json], :locale=>[:en, :en]}. Searched in: 
     * "/home/juan/rails_projects/answers/app/views" 
    # ./spec/views/answers/new.html.erb_spec.rb:16:in `block (2 levels) in <top (required)>' 

¿Podría ayudarme con esto? Estoy un poco despistado en este momento.

Respuesta

8

Creo que el error está en su punto de vista. ¿Puedes agregarlo?

Además, aquí hay algunos consejos sobre el uso de RSpec:

  • se puede poner tanto @question y @answer en un bloque let. Es la forma preferida de hacerlo en estos días. Mira los documentos, es bastante fácil de usar.
  • Debería utilizar FactoryGirl.create, no Factory(). Puede acortarlo a create si incluye Factory::Syntax::Methods en su configuración de RSpec.
  • En general, no es una buena idea mezclar dobles de prueba con modelos reales. Debe aislar las vistas de los modelos o integrarlos en su totalidad: reemplace stub_model por Answer.build o use un código auxiliar para @question y @answer. FactoryGirl tiene Factory.build_stubbed que es básicamente stub_model apropiado para ver las especificaciones.
  • Ver especificaciones han pasado desafortunado. Sugiero buscar en la lista de correo de RSpec para obtener detalles sobre por qué las personas eligen evitarlos. Mi opinión es que son bastante frágiles (fáciles de romper cuando se cambia el código), debido a sus dependencias con los modelos y los ayudantes. O te obligan a tropezar mucho, integrar los modelos o escribir un presentador simple. Dicho esto, tienen sus usos, pero son raros. Una mejor alternativa sería probar esta interacción en integración, ya sea usando pepino, filete o simplemente rspec y capibara.
  • Sus afirmaciones son ejemplos de cosas que normalmente no desea probar en una especificación de vista. Está afirmando la presencia de un marcado, incluidos los campos de formulario, que no es una buena prueba per se, ya que le dice que el formulario está allí, pero no que está funcionando. Obtendrá una mejor cobertura en integración. Además, será menos frágil: si renombra el modelo o el campo, por ejemplo, no necesitará cambiar la especificación de vista.
2

Me encontré con este problema. Si observa el seguimiento de la pila de cerca, verá que su vista se está llamando correctamente, pero hay un error en la línea 6.

En mi caso en este caso, esto fue causado por una llamada a uno de los raíles ayuda, algo así como answers_path(@question), pero estaba pasando nulo.

La solución es agregar una llamada assign para esa variable de instancia. Si se utiliza una variable local en su lugar, se puede pasar a través del hash :locals al llamar al render.

Cuestiones relacionadas