Đâ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
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