Trouble stubbing a method

Hey guys,

I’ll try to explain this without the model code at first, since there is
so
much, but if need be, I’ll pastie it.

I have an Order model that makes API calls to a payment
gateway(TrustCommerce) during validation(to verify the credit card
information). I’d like to stub this behavior to avoid thousands of calls
to
TrustCommerce a day(autotest).

All the calls are made in one method: Order#payment_authorize. This is
called from ActiveRecord#validate.

So, my thinking was just to stub out Order#payment_authorize. So here is
one
of my specs:

describe Order, “placed via the web” do

include OrderSpecHelper

before(:each) do
@order = generate_valid_web_order
@order.should_receive(:payment_authorize)
end

it do
@order.should be_valid
end

end

I’m using a mock for now, just to verify it does get called, once it’s
working I’ll change it to a stub. (I want to explicitly test it on
another
spec)

Anyhow, this doesn’t work, but sure enough, the calls out to
TrustCommerce
are being made. I also tried this:

describe Order, “placed via the web” do

include OrderSpecHelper

before(:each) do
@order = generate_valid_web_order
Order.should_receive(:payment_authorize)
end

it do
@order.should be_valid
end

end

However, this didn’t work either. Just for clarity, this is how it’s
being
called in the model:

validate :payment_authorize

How can I stub this method?

Thanks,

Matt L.

BTW…When I say, “this doesn’t work”

I mean the spec fails on the mock, saying the method was never called.
But,
indeed it was, I can verify it by the TrustCommerce logs.

On Nov 13, 2007, at 3:23 PM, Matthew L. wrote:

TrustCommerce a day(autotest).
include OrderSpecHelper

before(:each) do
@order = generate_valid_web_order
@order.should_receive(:payment_authorize)
end

You probably want @order.stub!(:payment_authorize) - should_receive
is an assertion. It doesn’t belong in a before(:each)/setup block.

If you want to test that the payment_authorize is called, you’ll want
to pull the assertion that you gave below into your spec:

describe Order, “placed via the web” do

include OrderSpecHelper

before(:each) do
@order = generate_valid_web_order
@order.stub!(:payment_authorize).and_return true
end

it “should try to authorize the payment when validating the
record” do
@order.should_receive(:payment_authorize).and_return true
@order.should be_valid
end

end

Scott