2012-04-01 44 views
5

Đây là bài tập về nhà mà tôi đang hướng tới để làm quen với TDD và Rspec. Nhưng bằng cách nào đó Tôi không hiểu tại sao các thử nghiệm sau thất bại:Rspec, kiểm tra bộ điều khiển cập nhật không hoạt động?

describe 'update' do 
    fixtures :movies 
    before :each do 
     @fake_movie = movies(:star_wars_movie) 
    end 
    it 'should retrieve the right movie from Movie model to update' do 
     Movie.should_receive(:find).with(@fake_movie.id.to_s).and_return(@fake_movie) 
     put :update, :id => @fake_movie.id, :movie => {:rating => @fake_movie.rating} 
    end 

    it 'should prepare the movie object available for update' do 
     put :update, :id => @fake_movie.id, :movie => {:rating => @fake_movie.rating} 
     assigns(:movie).should == @fake_movie 
    end 

    it 'should pass movie object the new attribute value to updated' do 
     fake_new_rating = 'PG-15' 
     @fake_movie.stub(:update_attributes!).with("rating" => fake_new_rating).and_return(:true) 
     put :update, :id => @fake_movie.id, :movie => {:rating => fake_new_rating} 
     @fake_movie.should_receive(:update_attributes!).with("rating" => fake_new_rating).and_return(:true) 
    end 
    end 

Thông báo lỗi tôi nhận được là:

Failures: 

    1) MoviesController update should pass movie object the new attribute value to updated 
    Failure/Error: @fake_movie.should_receive(:update_attributes!).with("rating" => fake_new_rating).and_return(:true) 
     (#<Movie:0xd39ea38>).update_attributes!({"rating"=>"PG-15"}) 
      expected: 1 time 
      received: 0 times 
    # ./spec/controllers/movies_controller_spec.rb:99:in `block (3 levels) in <top (required)>' 

Finished in 0.60219 seconds 
12 examples, 1 failure 

Failed examples: 

rspec ./spec/controllers/movies_controller_spec.rb:95 # MoviesController update should pass movie object the new attribute value to updated 

Về cơ bản nó nói rằng dòng cuối cùng của tôi về thử nghiệm thất bại @fake_movie.should_receive(:update_attributes!).with("rating" => fake_new_rating).and_return(:true), và tôi nghĩ nó không nhận được hàm gọi là 'update_attributes!', nhưng tại sao?

Và mã điều khiển:

def update 
    @movie = Movie.find params[:id] 
    @movie.update_attributes!(params[:movie]) 
    flash[:notice] = "#{@movie.title} was successfully updated." 
    redirect_to movie_path(@movie) 
    end 

Cảm ơn trước

Trả lời

3

nên là:

it 'should pass movie object the new attribute value to updated' do 
    fake_new_rating = 'PG-15' 
    Movie.stub(:find).and_return(@fake_movie) 
    @fake_movie.should_receive(:update_attributes!).with("rating" => fake_new_rating).and_return(:true) 
    put :update, :id => @fake_movie.id, :movie => {:rating => fake_new_rating} 
end 

Nếu không, dòng @movie = Movie.find params[:id] sẽ truy vấn chống lại mô hình.

+2

Là một thực hành tốt chỉ dành cho những gì bạn sở hữu, bạn không sở hữu 'find' hoặc' update_attributes', bạn không nên khai báo chúng – Calin

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