2013-02-18 40 views
14

我是新來的Rails和RSpec和我使用Rspec的測試這個控制器的方法,包括異常處理:如何在Rails中使用Rspec提升錯誤提升?

def search_movies_director 
    @current_movie = Movie.find(params[:id]) 
    begin 
    @movies = Movie.find_movies_director(params[:id]) 
    rescue Movie::NoDirectorError 
    flash[:warning] = "#{@current_movie} has no director info" 
    redirect_to movies_path 
    end 
end 

我無法弄清楚如何正確測試說路徑:無效的搜索後, (當收到錯誤時)它應該重定向到主頁。我想是這樣的:

describe MoviesController do 
    describe 'Finding Movies With Same Director' do 
    #some other code 

    context 'after invalid search' do 
     it 'should redirect to the homepage' do 
     Movie.stub(:find) 
     Movie.stub(:find_movies_director).and_raise(Movie::NoDirectorError) 
     get :search_movies_director, {:id => '1'} 
     response.should redirect_to movies_path 
     end 
    end 

    end 
end 

運行測試後因錯誤而失敗:NameError: uninitialized constant Movie::NoDirectorError

如何假扮在本次測試引發錯誤,因此實際檢查重定向是否會發生?

謝謝!

UPDATE:

由於nzifnab解釋說,它無法找到Movie::NoDirectorError。我忘了定義這個異常類。所以我把它添加到app/models/movie.rb

class Movie < ActiveRecord::Base 
    class Movie::NoDirectorError < StandardError ; end 
    #some model methods 
end 

這解決了我的問題,這個測試通過。

回答

11

該錯誤表明它不知道定義異常類的位置。您可能需要專門require定義該類的文件,或者測試可能無法找到它。

Rails將自動嘗試使用常規文件目錄格式定位任何constant missing常量。它將根據常量的名稱在load_pathmovie/no_director_errormovie中查找文件。如果沒有找到該文件,或者該文件沒有定義預期的常量,則需要自己專門要求該文件。

+0

你說得對,'Movie :: NoDirectorError'沒有被定義在任何地方。我在'app/models/movie.rb'中定義了這個異常類,現在我的測試通過了。謝謝! – 2013-02-18 19:58:45

18

你非常接近。您需要在那裏添加any_instance

Movie.any_instance.stub(:find_movies_director).and_raise(Movie::NoDirectorError) 

編輯:我誤讀了帖子。以上將給出一個電影的實例,但不適用於OP的問題。

+1

這不是他的使用實例方法,它是一個類的方法。他說得對。 – nzifnab 2013-02-18 18:40:16

+0

只需添加any_instance並不適用於我,仍然會出現相同的錯誤。 – 2013-02-18 18:59:55

+0

Doh。你是對的。我誤解了一些東西。不理我。 – 2013-02-18 20:46:58

0

在Rails 4.1:

verse_selector = double("VerseSelector", select_verses: ActiveRecord::RecordNotFound.new("Verses not found"))

verse_selector.select_verses現在會返回一個ActiveRecord::RecordNotFound