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.
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).