2012-04-01 4 views
5

यह एक होमवर्क है जो मैं टीडीडी और रुपेक के साथ परिचित होने की दिशा में काम कर रहा हूं। लेकिन किसी भी तरह मुझे समझ नहीं नहीं क्यों निम्नलिखित परीक्षण विफल:रुपयेपीईसी, अद्यतन नियंत्रक के लिए परीक्षण काम नहीं कर रहा है?

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 

त्रुटि संदेश मुझे मिल गया है:

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 

मूल रूप से यह कहा गया है कि परीक्षण के अपने अंतिम पंक्ति में विफल रहा है @fake_movie.should_receive(:update_attributes!).with("rating" => fake_new_rating).and_return(:true), और मुझे लगता है कि इसे फ़ंक्शन कॉल 'update_attributes!' बिल्कुल प्राप्त नहीं हुआ, लेकिन क्यों?

और नियंत्रक कोड:

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 

अग्रिम धन्यवाद

उत्तर

3

होना चाहिए:

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 

अन्यथा, लाइन @movie = Movie.find params[:id] मॉडल के खिलाफ क्वेरी होगा।

+2

एक अच्छी प्रैक्टिस के रूप में केवल वही है जो आपके पास है, आपके पास 'ढूंढ' या 'update_attributes' नहीं है, आपको उन्हें स्टब नहीं करना चाहिए – Calin

संबंधित मुद्दे