2012-04-07 50 views
6

Tôi đang viết spec cho điều khiển:RSpec. Làm cách nào để kiểm tra xem phương thức đối tượng có được gọi không?

it 'should call the method that performs the movies search' do 
    movie = Movie.new 
    movie.should_receive(:search_similar) 
    get :find_similar, {:id => '1'} 
end 

và điều khiển của tôi trông giống như:

def find_similar 
@movies = Movie.find(params[:id]).search_similar 
end 

sau khi chạy các rspec tôi nhận được như sau:

Failures: 
1) MoviesController searching by director name should call the method that performs the movies search 
Failure/Error: movie.should_receive(:search_similar) 
    (#<Movie:0xaa2a454>).search_similar(any args) 
     expected: 1 time 
     received: 0 times 
# ./spec/controllers/movies_controller_spec.rb:33:in `block (3 levels) in <top (required)>' 

mà tôi dường như để hiểu và chấp nhận, bởi vì trong mã điều khiển của tôi tôi gọi phương thức Class (Movie) và tôi không thấy bất kỳ cách nào để kết nối "find_similar" với đối tượng, được tạo ra trong SPE c.

Vì vậy, câu hỏi là -> cách nào để kiểm tra xem phương thức được gọi trên đối tượng, được tạo theo thông số?

Trả lời

7
it 'should call the method that performs the movies search' do 
    movie = Movie.new 
    movie.should_receive(:search_similar) 
    Movie.should_receive(:find).and_return(movie) 
    get :find_similar, {:id => '1'} 
end 

Vì cái gì có giá trị, tôi hoàn toàn chống lại những cuống-all-điều thử nghiệm, họ chỉ thực hiện thay đổi mã khó hơn và thực sự không thử nghiệm gì ngoài cấu trúc mã.

+0

Đồng ý về việc quá cứng đầu, thấy quá nhiều kiểm tra kiểm tra rằng phương pháp stubbing hoạt động thay vì kiểm tra xem ứng dụng có hoạt động hay không. – njorden

+0

đẹp nhất. đây là các tài liệu về relish: https://www.relishapp.com/rspec/rspec-mocks/v/2-5/docs/message-expectations Tôi cần bit này 'obj.should_receive (: message) .với ('more_than ',' one_argument ') ' – TomDunning

+0

sử dụng thú vị các thẻ" " – fotanus

0

Lúc đầu, phim của bạn chưa được duy trì.

Tại thứ hai, không thực tế, mà sẽ có id 1

Vì vậy, cố gắng này

it 'should call the method that performs the movies search' do 
    movie = Movie.create 
    movie.should_receive(:search_similar) 
    get :find_similar, {:id => movie.id} 
end 
+0

cảm ơn vì "id", bạn hoàn toàn đúng. câu hỏi chính là vẫn còn ở đây, sau khi thay đổi mã tin nhắn là như nhau -> Thất bại/Lỗi: movie.should_receive (: search_similar) (# ). search_similar (bất kỳ args) dự kiến: 1 lần nhận được: 0 lần –

+0

Thật kỳ lạ rằng trong phiên bản đầu tiên của spec 'Movie.find (params [: id])' không tăng 'RecordNotFound' .. – MikDiet

+0

tôi tải một số đối tượng với fixture, một trong những có: id = > '1' ... –

Các vấn đề liên quan