2012-10-08 3 views
0

다음과 같은 컨트롤러 사양이 있습니다. 그러나 create(:link) 객체를 모의 또는 스텁으로 대체하고 싶습니다. after_create 콜백 update_target을 어떻게 해결할 수 있습니까?다형성 연관을 사용하여 객체를 모의하거나 스터핑하는 방법! 콜백에?

undefined method `save!' for nil:NilClass하는 사양 착륙 개체를 만들려고 : 임 mock_model(Link) 할 때

는 지금은 오류가 발생합니다.

describe LandingsController do 
    describe "#destroy" do 

    before(:each) do 
     controller.stub(:current_user).and_return(mock_model(User)) 
     stub_request(:any, "www.example.com").to_return(status: 200) 
     @link = create(:link) 
    end 

    let(:landing) do 
     create(:landing, target_id: @link.id) 
    end 

    it "destroys the landing" do 
     Landing.should_receive(:find).with(landing.id.to_s).and_return(landing) 
     landing.should_receive(:destroy).and_return(true) 
     delete :destroy, id: landing.id, format: :json 
    end 

    it "returns 204" do 
     delete :destroy, id: landing.id, format: :json 
     response.status.should == 204 
    end 
    end 
end 

class Landing < ActiveRecord::Base 
    belongs_to :target, polymorphic: true 
    ... 
    after_create :update_target 
    before_destroy :update_target 

    def update_target 
    self.target.save! 
    end 
end 

# landings_controller.rb 
    respond_to :json 

    def destroy 
    landing = Landing.find(params[:id]) 
    target = landing.target 
    landing.destroy 
    target.save! 
    respond_with landing 
    end 

어쩌면 나는 또한 착륙해야한다. 그러나 그것을하는 방법?

답변

0

let(:landing) do 
    mock(:landing, target_id: @link.id, destroy: true) 
end 

이 문제를 해결합니까?

+0

해당 사양에 대한 공장을 사용하여 (: 링크)를 만들고 싶지 않습니다. 당신의 대답은 저에게 오류를줍니다 :''모의 (Mock) : 예기치 않은 메시지를받은 태깅 :''실패한/오류 : Tagging.should_receive (: find) .with (tagging.id.to_s) .and_return (태깅)'' – tomekfranek

+0

태깅 ??? 내 코드와 아무 관련이 없습니다! – rewritten

관련 문제