2013-02-18 24 views
14

Tôi mới đến Rails và RSpec và tôi đang sử dụng RSpec để kiểm tra phương pháp điều khiển này bao gồm xử lý ngoại lệ:Làm cách nào để tăng lỗi khi sử dụng Rspec trong Rails?

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 

tôi không thể tìm ra cách để kiểm tra một cách chính xác con đường cho biết: sau khi tìm kiếm không hợp lệ (khi nhận được lỗi) nó sẽ chuyển hướng đến trang chủ. Tôi cố gắng một cái gì đó như thế này:

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 

Sau khi chạy thử nghiệm không thành công với một lỗi: NameError: uninitialized constant Movie::NoDirectorError

Làm thế nào để nâng cao giả một lỗi trong bài kiểm tra này để nó thực sự kiểm tra xem chuyển hướng sẽ xảy ra?

Cảm ơn!

UPDATE:

Như nzifnab giải thích, nó có thể không xác định vị trí Movie::NoDirectorError. Tôi quên định nghĩa lớp ngoại lệ này. Vì vậy, tôi đã thêm nó vào app/models/movie.rb:

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

Điều này giải quyết được vấn đề của tôi và thử nghiệm này vượt qua.

Trả lời

11

Lỗi cho biết nó không biết vị trí mà lớp học ngoại lệ Movie::NoDirectorError được xác định. Bạn có thể cần cụ thể require tệp nơi lớp đó được xác định hoặc thử nghiệm có thể không tìm thấy được.

Đường ray sẽ tự động tìm cách định vị bất kỳ hằng số constant missing nào bằng định dạng thư mục tệp thông thường. Nó sẽ tìm kiếm một tệp trong số load_path tại movie/no_director_errormovie dựa trên tên của hằng số. Nếu tệp không được tìm thấy hoặc tệp không xác định được hằng số dự kiến, bạn sẽ cần phải tự mình yêu cầu tệp đó.

+0

Bạn nói đúng, 'Phim :: NoDirectorError' không được định nghĩa ở bất cứ đâu. Tôi đã định nghĩa lớp ngoại lệ này trong 'app/models/movie.rb' và thử nghiệm của tôi đã trôi qua ngay bây giờ. Cảm ơn! –

18

Bạn đang ở rất gần. Bạn cần thêm any_instance vào đó.

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

chỉnh sửa: Tôi đã đọc sai bài đăng. Ở trên sẽ làm việc cho một thể hiện của phim, nhưng không phải cho câu hỏi của OP.

+1

Nó không phải là một phương pháp dụ anh ấy sử dụng, đó là một phương pháp lớp. Anh ấy đã đúng. – nzifnab

+0

Chỉ cần thêm any_instance không hoạt động đối với tôi, vẫn gặp lỗi tương tự. –

+0

Doh. Bạn đúng. Tôi đọc nhầm mọi thứ. Phớt lờ tôi. –

0

Trong Rails 4.1:

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

verse_selector.select_verses bây giờ sẽ trả về một ActiveRecord::RecordNotFound