Forum: RSpec Noob (mock/stub) ActiveMerchant..

Posted by internetchris (Guest)
on 2011-10-31 15:33
(Received via mailing list)
Hi Group

I'm still waiting for the light to come on with stubbing/mocking and
the syntax for each. I have simple method in my Order class like
so....

 def credit_card
    ActiveMerchant::Billing::CreditCard.new(
      :type               => card_type,
      :number             => card_number,
      :verification_value => card_verification,
      :month              => card_expires_on.blank? ? Time.now.month :
card_expires_on.month,
      :year               => card_expires_on.blank? ? Time.now.year :
card_expires_on.year,
      :first_name         => first_name,
      :last_name          => last_name
    )
  end

This method should return valid if the card is valid.
http://activemerchant.rubyforge.org/classes/Active...

I started out like this but then confusion set in. If anyone has the
time to help me understand or write the proper spec for this method I
think it will help me better understand how to stub or mock a 3rd
party item like this. I just watched the peepcode screencast and I've
watched the railscasts. I'm just trying to apply my meager
understanding to my own project now.

it "should validate credit card" do
      gateway = stub('gateway')
      gateway.should_recieve(:valid)
      ActiveMerchant::Billing::CreditCard.stub(:new).and_return
gateway
    end

I also have a credit card Factory setup, but I'm not sure where or how
I apply this to the stub.

Thanks in advance!
Posted by Justin Ko (Guest)
on 2011-10-31 20:02
(Received via mailing list)
On Oct 28, 2011, at 10:16 AM, internetchris wrote:

>      :verification_value => card_verification,
> 
http://activemerchant.rubyforge.org/classes/Active...
>      gateway.should_recieve(:valid)
>      ActiveMerchant::Billing::CreditCard.stub(:new).and_return
> gateway
>    end

This RSpec example has nothing to do with a gateway. Also, it is a 
credit card object, which does not talk to any third party service. You 
don't need to use any mocking here.

You probably want to make sure the credit_card *can* be valid. So to do 
so, you'll need to create a valid user (or whatever model this 
credit_card method is in:

describe User do
  describe '#credit_card' do
    context 'with a valid user' do
      let(:user) { create(:user) }

      it 'returns a valid credit card instance' do
        user.credit_card.should 
be_an_instance_of(ActiveMerchant::Billing::CreditCard)
        user.credit_card.should be_valid
      end
    end
  end
end

Now, your User factory would fill in all the credit card fields so the 
credit card is able to be valid. I would also check that the credit card 
has the correct attributes:

describe User do
  describe '#credit_card' do
    context 'with a valid user' do
      let(:user) { create(:user, card_type: 'Visa') }

      describe 'the returned credit card instance' do
        it 'has the correct card_type' do
          user.credit_card.card_type.should eq('Visa')
        end
      end
    end
  end
end

As far as mocking third party gateway services, ActiveMerchant provides 
built in support to switch a gateway to its "test" mode, which you would 
do in your test.rb environment. ActiveMerchant has good documentation 
for all of this.

Hope that helps.
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.