views:

171

answers:

2

I have a rspec mocked object, a value is assign to is property. I am struggleing to have that expectation met in my rspec test. Just wondering what the sytax is? The code:

def create
@new_campaign = AdCampaign.new(params[:new_campaign])
@new_campaign.creationDate = "#{Time.now.year}/#{Time.now.mon}/#{Time.now.day}"
if @new_campaign.save
  flash[:status] = "Success"
else
  flash[:status] = "Failed"
end end

The test

it "should able to create new campaign when form is submitted" do
  campaign_model = mock_model(AdCampaign)
  AdCampaign.should_receive(:new).with(params[:new_campaign]).and_return(campaign_model)
  campaign_model.should_receive(:creationDate).with("#{Time.now.year}/#{Time.now.mon}/#{Time.now.day}")campaign_model.should_receive(:save).and_return(true)
  post :create

  flash[:status].should == 'Success' 
  response.should render_template('create') end

The problem is I am getting this error:

Spec::Mocks::MockExpectationError in 'CampaignController new campaigns should able to create new campaign when form is submitted' Mock "AdCampaign_1002" received unexpected message :creationDate= with ("2010/5/7")

So how do i set a expectation for object property assignment?

Thanks

A: 

Found a link about it here

This is by simply add :creationDate= rather then just :creationDate in the expectation.

+ you can also use (:createionDate=).with(<expected value>)
+2  A: 

There is no such thing as "property assignment" in Ruby. In Ruby, everything is a method call. So, you mock the setter method just like you would any other method:

campaign_model.should_receive(:creationDate=).with(...)

BTW: the diagnostic messages that the tests print out are not just for shpw. In this case, the message already tells you everything you need to know:

Spec::Mocks::MockExpectationError in 'CampaignController new campaigns should able to create new campaign when form is submitted' Mock "AdCampaign_1002" received unexpected message :creationDate= with ("2010/5/7")

As you can see, the message you posted already tells you what the name of the method is you need mock right there:

 unexpected message :creationDate= with ("2010/5/7")
                    ^^^^^^^^^^^^^^
Jörg W Mittag