2014-07-10 1 views
0

Je veux tester mon contrôleur et assurez-vous qu'il rend le modèle approprié chaque fois qu'il reçoit un ActiveRecord::RecordNotFoundRspec3: Envoyer une exception au contrôleur

Le contrôleur:

class QuestionnaireController < ApplicationController 

    rescue_from ActiveRecord::RecordNotFound, with: :verses_not_found 

    def poem 
    @questionnaire = JSON.parse(session[:questionnaire], symbolize_names: true) 
    rawVerses = VerseSelector.select_verses(@questionnaire[:trait_category], @questionnaire[:message_category]) 
    @poem = PoemCustomizer.customize_poem(rawVerses, @questionnaire) 
    end 

    def verses_not_found 
    render 'questionnaire/verses_not_found' 
    end 
end 

Mon test:

describe "GET 'poem'" do 
    it "renders questionnaire/verses_not_found.html if theres an ActiveRecord::RecordNotFound exception" do 
    verse_selector = double("VerseSelector", select_verses: ActiveRecord::RecordNotFound.new("Verses not found")) 
    get 'poem', nil, {questionnaire: {receiver_name:"a",location:"b",relationship:"coach",trait_category:"adventurous venturous",message_category:"You hurt my feelings"}}.to_json 
    expect(response).to render_template(:verses_not_found) 
    end 
end 

Je ne suis pas du tout sûr de mon test, qui génère actuellement une erreur: NoMethodError: undefined method 'each' for #<String:0xbcdf388>

Comment écrire correctement mon test?

+1

Je Stub poème pour élever RecordNotFound puis tester pour voir si verses_not_found a été reçue lors de l'appel poème moi-même. Puis un autre test pour voir si la dernière méthode a rendu la bonne page. –

+0

Je créerais une action anonyme qui déclencherait RecordNotFound et obtenir cette action pour vérifier que le modèle attendu est rendu – Benj

Répondre

0

j'ai réussi à simuler un ActiveRecord::RecordNotFound avec le code suivant:

it "renders questionnaire/verses_not_found.html if theres an ActiveRecord::RecordNotFound exception" do 
    verse_selector = double("verse_selector") 
    allow(verse_selector).to receive(:select_verses).and_return(ActiveRecord::RecordNotFound.new()) 
    get 'poem', nil, {"questionnaire" => {"receiver_name"=> "a","location"=> "b","relationship"=> "coach","trait_category"=> "adventurous venturous","message_category"=> "You hurt my feelings"}.to_json} 
    expect(response).to render_template(:verses_not_found) 
end 
Questions connexes