The spec -------------------------------------------------------------------------------------------------------------------------------------------------------- it "should expose a newly created logo as @logo" do Logo.should_receive(:new).with({''these'' => ''params''}).and_return(mock_logo(:save => true)) Logo.should_receive(:company=).with(mock_model(Company)) post :create, :logo => {:these => ''params''} assigns(:logo).should equal(mock_logo) end The code: -------------------------------------------------------------------------------------------------------------------------------------------------------- def create @logo = Logo.new(params[:logo]) @logo.company = current_user.company puts current_user.full_name if @logo.save flash[:notice] = ''You logo was successfully uploaded.'' redirect_to logo_setting_path else render :action => logo_setting_path end end And the error: -------------------------------------------------------------------------------------------------------------------------------------------------------- Spec::Mocks::MockExpectationError in ''LogosController responding to POST create with valid params should expose a newly created logo as @logo'' Mock ''Logo_1001'' received unexpected message :company= with (#<Company:0x219a800 @name="Company_1">) Question: How could I mock a company= methond on Logo? -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://rubyforge.org/pipermail/rspec-users/attachments/20081030/529ae69c/attachment.html>
On Thu, 2008-10-30 at 14:47 +0800, Leon Du wrote:> The spec > -------------------------------------------------------------------------------------------------------------------------------------------------------- > it "should expose a newly created logo as @logo" do > Logo.should_receive(:new).with({''these'' => > ''params''}).and_return(mock_logo(:save => true)) > Logo.should_receive(:company=).with(mock_model(Company)) > post :create, :logo => {:these => ''params''} > assigns(:logo).should equal(mock_logo) > endThe instance of Logo should receive the company= method, not the class, so: @logo = mock_logo Logo.should_receive(:new).and_return(@logo) @logo.should_receive(:company=) I would probably use stub! instead here and move this code into a before block, and just keep the post and assigns lines in the it block. Hans -------------- next part -------------- A non-text attachment was scrubbed... Name: not available Type: application/pgp-signature Size: 197 bytes Desc: This is a digitally signed message part URL: <http://rubyforge.org/pipermail/rspec-users/attachments/20081030/9d2168fe/attachment-0001.bin>
Thanks for your reply, I did move the code to before before(:each) do Logo.stub!(:new).and_return(mock_logo(:save => true, :company= => nil)) end 2008/10/30 Hans de Graaff <hans at degraaff.org>> On Thu, 2008-10-30 at 14:47 +0800, Leon Du wrote: > > The spec > > > -------------------------------------------------------------------------------------------------------------------------------------------------------- > > it "should expose a newly created logo as @logo" do > > Logo.should_receive(:new).with({''these'' => > > ''params''}).and_return(mock_logo(:save => true)) > > Logo.should_receive(:company=).with(mock_model(Company)) > > post :create, :logo => {:these => ''params''} > > assigns(:logo).should equal(mock_logo) > > end > > The instance of Logo should receive the company= method, not the class, > so: > > @logo = mock_logo > Logo.should_receive(:new).and_return(@logo) > @logo.should_receive(:company=) > > I would probably use stub! instead here and move this code into a before > block, and just keep the post and assigns lines in the it block. > > Hans > > _______________________________________________ > rspec-users mailing list > rspec-users at rubyforge.org > http://rubyforge.org/mailman/listinfo/rspec-users >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://rubyforge.org/pipermail/rspec-users/attachments/20081030/9226257e/attachment.html>