2014-07-10 9 views
10

Moja aplikacja propaguje ActiveRecord :: RecordNotFound do kontrolera, gdy model nie może pobrać rekordu.Test dla ActiveRecord :: RecordNotFound

Oto kwerendy DB:

def self.select_intro_verse 
    offset = rand(IntroVerse.count) 
    IntroVerse.select('line_one', 'line_two', 'line_three', 'line_four', 'line_five').offset(offset).first!.as_json 
end 

first! podnosi ActiveRecord::RecordNotFound jeśli nie zostanie znaleziony rekord, i jestem w stanie go uratować i zdać odpowiedni szablon w moim kontrolera.

Jest to oczekiwane zachowanie, więc chciałbym mieć test na to w mojej specyfikacji. Napisałem:

context "verses missing in database" do 
    it "raises an exception" do 
    expect(VerseSelector.select_intro_verse).to raise_exception 
    end 
end 

Kiedy biegnę rspec:

1) VerseSelector verses missing in database raises an exception Failure/Error: expect(VerseSelector.select_intro_verse).to raise_exception ActiveRecord::RecordNotFound: ActiveRecord::RecordNotFound

Dla mnie test nie powiedzie się, mimo że jest wyjątek! Jak mogę przekazać test?

Odpowiedz

22

Look w dokumentacji rspec-expectations#expecting-errors tym:

expect(VerseSelector.select_intro_verse).to raise_exception 

powinny być except składnia wyjątku muszą być lambda lub proc:

expect { VerseSelector.select_intro_verse }.to raise_exception(ActiveRecord::RecordNotFound) 
+0

+1 być uczciwym. :-) –

+0

_muszę być lambda lub proc_ - powinno być pogrubione :) – Fabio

Powiązane problemy