ruby-on-railsrubyunit-testingtestunitruby-mocha

Mocking an external API


I'm new to testing strategies and mocking, and I'm having a tough time figuring out how to mock a call to an external service. I'm sure it's something easy I'm missing, I just don't know what exactly.

I'm using the Braintree gem to charge for subscription services through the Braintree gateway, and I wanted to mock the Customer create method and Subscription create method in my UserController's create method.

A Customer.create method looks something like this:

  result = Braintree::Customer.create(
    :first_name => @creditcard.first_name,
    :last_name => @creditcard.last_name,
    :email => @user.email
    :credit_card => {
      ...
      }
    }
  )

This returns a Braintree::Successful result object, with the attributes of the processed result.

I figure I have to do something like:

Braintree::Customer.expects(:create).returns(...)

But what goes in the returns area? Do I need to create my own mocked up Successful object with the attributes of a faked processed result, or is there an easier way to do all of that?

Thanks for any help you can provide.


Solution

  • You can return an OpenStruct as suggested in the comment or a stub or mock, which is IMHO better and more useful for tests, because you can easily set expectations, like this:

    Braintree::Customer.expects(:create).returns(mock(:save => true))
    

    The returned mock will expect the save message (which may not make sense in this case, but should give you the idea).