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>