[rspec-users] RSpec whines when I set the value of an object

Nick Hoffman nick at deadorange.com
Wed Nov 5 15:37:54 EST 2008


On 2008-11-05, at 15:23, Fernando Perez wrote:
> Hmmm, I don't have this problem as I am using ruby-forum.com to browse
> threads, it is x100 times more readable with basic color highlighting.
> I'll do my best to include quotes for people who use regular mail
> clients.
>
> So here is my controller code:
> --
> def index
>  @items = Item.find_for_payment(session[:order_id], @site.id)
>  @cart.amount = @items.sum { |item| item.price.to_i *
> item.quantity.to_i }
> end
> --
>
> And my spec:
> --
>  it "should display cart" do
>    @items = []
>    1.upto(2) do |i|
>      @items << mock_model(Item, :id => i, :price => 10 * i, :quantity
> => i, :order_id => 1)
>    end
>
>    Item.stub!(:find_for_payment).and_return(@items)
>
>    @cart = mock_model(Order, :id => 1, :amount => 0, :tax => 0)
>    Order.stub!(:find_cart).and_return(@cart)
>
>    Item.should_receive(:find_for_payment).with(1,  
> 1).and_return(@items)
>    @cart.should_receive(:amount=).with(50)
>    @cart.amount.should eql(50)
>
>    get :index
>  end
> --
>
> This throws the error: expected 50, got 0 (using .eql?)
>
> As I said, I don't actually save the @cart object in DB, I just
> temporarily set its amount attribute so that it will print the value  
> in
> the corresponding view. I am now wondering why RSpec doesn't see it is
> set to 50.

This expectation:
   @cart.amount.should eql(50)
is just testing Order#amount= . In my opinion, that's not necessary,  
because Order#amount= is provided by Rails, which you can be confident  
has been tested fully.

This expectation:
   @cart.should_receive(:amount=).with(50)
is what you really want, because it's ensuring that Order#amount= is  
being called with the correct value.

So, just remove the "should eql(50)" expectation, and you're all set!
-Nick


More information about the rspec-users mailing list