Ivo,
Thank you for that explanation! That was exactly what I needed. I feel
like I understand things more clearly after that. I just need to
remember to keep my tests small.
Thanks!
Dave
On Wed, Mar 19, 2008 at 11:01 AM, Ivo Dancet <[EMAIL PROTECTED]> wrote:
> Op 19-mrt-08, om 16:33 heeft Dave het volgende geschreven:
>
>
>
> > Hi there,
> >
> > I'm still trying to wrap my head around when to use a stub and a mock.
> > If I understand this right, I should be using a 'mock' when imitating
> > an object, but not its behavior. I should be using a stub when I want
> > to imitate the behavior of an object. Does that sound about right?
> >
> > With that said, I'm struggling a little trying to spec out this
> > instance method that is available to a User object. The method takes
> > an OrderPaymentInfo object and copies its attributes onto the User's
> > attributes (Ignore the clunky design... that's just how it has to be).
> >
> > The User's instance method looks like so:
> >
> > class User
> > def update_billing_info(billing_info)
> > unless self.has_billing_address?
> > self.bill_to_address1 = billing_info.address1
> > self.bill_to_address2 = billing_info.address2
> > self.bill_to_address3 = billing_info.address3
> > self.bill_to_city = billing_info.city
> > self.bill_to_country_code = billing_info.country_code
> > self.bill_to_state_province_code =
> > billing_info.state_province_code
> > self.bill_to_postal_code = billing_info.postal_code
> > self.bill_to_phone_number = billing_info.phone_number
> > self.bill_to_extension = billing_info.extension
> > self.bill_to_fax = billing_info.fax_number
> > self.save ? true : false
> > else
> > true
> > end
> > end
> >
>
> If this is activerecord you could use
> self.update_attributes(billing_info)
>
>
> >
> > Here's the spec:
> >
> > describe User, "when checking billing information" do
> > before(:each) do
> > @user = User.new(:id => 1)
> > @order_payment_info = mock_model(OrderPaymentInfo,
> > :id => 1,
> > :user_id => @user.id,
> > :address1 => "555 Rd.",
> > :address2 => "Ste 2",
> > :address3 => "line 3",
> > :city => "Chicago",
> > :country_code => "USA",
> > :state_province_code => "IL",
> > :psotal_code => "12345",
> > :phone_number => "5551234321",
> > :extension => "123",
> > :fax_number => "5551234321")
> > @user.stub!(:update_billing_info).with(@order_payment_info)
> > end
>
> You just stubbed update_billing_info (called with @order_payment_info)
> on @user, which means the real method will not be used anymore. Your
> tests will use the stub instead of the real method. Don't stub the
> very thing you want to test!
>
>
> >
> >
> > it "should update billing information when User's billing info is
> > nil" do
> >
> > @user.should_receive(:update_billing_info).with(@order_payment_info)
> > @user.update_billing_info(@order_payment_info)
> > @user.stub!(:has_billing_address?).and_return(false)
> > @user.bill_to_address1.should eql("555 Rd.")
> > @user.bill_to_address2.should eql("Ste 2")
> > end
> >
> >
> > end
> >
> > When I run this spec I get an "error" of:
> >
> > 1)
> > 'User when checking billing information should update billing
> > information when User's billing info is nil' FAILED
> > expected "555 Rd.", got nil (using .eql?)
> >
>
> Try to test one thing at a time, you shouldn't test everything about
> that method in one test. To me your test description does not tell a
> thing:
>
>
> 'User when checking billing information should update billing
> information when User's billing info is nil'
>
> This says much more:
>
> 'User instance object update_billing_info should update the billing
> address part 1'
>
> You can build this up like this:
>
> describe User, "instance object" do
> before(:each) do
> @user = User.create( ... )
> end
> describe "update_billing_info" do
> it "should update the billing address part 1" do
>
> @user.update_billing_info( @order_payment_info )
> @user.bill_to_address1.should == "555 Rd."
> end
> it "should ..." ...
> end
> end
>
>
> Try to make small tests (make a new test if the first works) and try
> to build the model with the tests instead of the other way around.
>
> gr
> Ivo
> _______________________________________________
> rspec-users mailing list
> [email protected]
> http://rubyforge.org/mailman/listinfo/rspec-users
>
_______________________________________________
rspec-users mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/rspec-users