2012-07-08 12 views
5

Sto lavorando a una sorta di app di Yahoo Answers per migliorare le mie competenze su Rails. Finora ho impostato due modelli "Domanda" e "risposte" e si sono annidati in questo modo:Rspec e Rails con test di visualizzazione e risorse nidificate

resources :questions do 
    resources :answers 
    end 

Ho fatto i test per i controllori, i modelli e viste le domande, ma sono avere un piccolo problema con la vista delle risposte e le rotte nidificate. Sto usando Rspec e Factory girl.

Ho il seguente test:

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 

e ogni volta che ho eseguito il test ricevo il seguente messaggio:

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

Ho provato molte cose come facendo

render new_question_answer_path(@question) 

ma ottengo questo:

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

Per favore, aiutatemi con questo? Sono un po 'incapace in questo momento.

risposta

8

Penso che l'errore sia a tuo avviso. Puoi aggiungerlo?

Inoltre, ecco alcuni consigli sull'utilizzo RSpec:

  • si potrebbe mettere sia @question e @answer in un blocco let. È il modo preferito di farlo in questi giorni. Dai un'occhiata ai documenti, è abbastanza semplice da usare.
  • Si dovrebbe effettivamente utilizzare FactoryGirl.create, non Factory(). È possibile accorciarlo su create se si include Factory::Syntax::Methods nella configurazione di RSpec.
  • Generalmente non è una buona idea mescolare i doppi di prova con i modelli reali. È necessario isolare le viste dai modelli o integrarle completamente: sostituire lo stub_model con Answer.build o utilizzare uno stub per @question e @answer. FactoryGirl ha Factory.build_stubbed che è fondamentalmente stub_model appropriato per le specifiche di visualizzazione.
  • Le specifiche di visualizzazione sono cadute in disgrazia. Suggerisco di cercare la mailing list di RSpec per i dettagli sul perché le persone scelgono di evitarli. La mia opinione è che sono abbastanza fragili (facili da interrompere quando si cambia codice), a causa della dipendenza da modelli e assistenti. O ti costringono a stub molto, integri i modelli o scrivi un semplice presentatore. Detto questo, hanno i loro usi, ma sono rari. Un'alternativa migliore sarebbe quella di testare questa interazione in integrazione, usando cetriolo, bistecca o solo rspec e capibara.
  • Le tue affermazioni sono esempi di cose che di solito non vuoi testare in una vista specifica. Stai affermando la presenza di alcuni markup, inclusi i campi modulo, che non è un buon test di per sé, dal momento che ti dice che il modulo è lì, ma non che funzioni. Otterrai una copertura migliore nell'integrazione. Inoltre, sarà meno fragile: se si rinomina il modello o il campo, ad esempio, non sarà necessario modificare le specifiche della vista.
2

Mi sono imbattuto in questo problema. Se osservi attentamente la traccia dello stack, vedrai che la tua vista viene richiamata correttamente, ma c'è un errore sulla linea 6.

Nel mio caso, questo è stato causato da una chiamata a uno dei percorsi del percorso di rotaie, qualcosa come answers_path(@question), ma è stato passato zero.

La correzione consiste nell'aggiungere una chiamata assign per tale variabile di istanza. Se invece viene utilizzata una variabile locale, può essere inoltrata tramite l'hash :locals quando si chiama render.

Problemi correlati