Насмешка над внешним API

Я новичок в тестировании стратегий и насмешках, и мне трудно понять, как имитировать вызов внешней службы. Я уверен, что мне чего-то не хватает, я просто не знаю, что именно.

Я использую гем Braintree для взимания платы за услуги подписки через шлюз Braintree, и я хотел смоделировать метод создания клиента и метод создания подписки в методе создания моего UserController.

Метод Customer.create выглядит примерно так:

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

Это возвращает объект результата Braintree::Successful с атрибутами обработанного результата.

Я полагаю, что мне нужно сделать что-то вроде:

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

Но что происходит в зоне возврата? Нужно ли мне создавать свой собственный смоделированный объект Successful с атрибутами поддельного обработанного результата, или есть более простой способ сделать все это?

Спасибо за любую помощь, которую вы можете предоставить.


person joeellis    schedule 03.08.2010    source источник
comment
Вам нужно вернуть некоторый объект, который либо есть, либо крякает, как Braintree::Customer. Иногда я просто использую OpenStruct.   -  person rogerdpack    schedule 04.08.2010
comment
Ах, я думаю, это именно то, что я ищу. Просто что-то, чтобы имитировать одну и ту же базовую структуру. Спасибо!   -  person joeellis    schedule 04.08.2010


Ответы (1)


Вы можете вернуть OpenStruct, как предложено в комментарии, или stub или mock, что ИМХО лучше и полезнее для тестов, потому что вы можете легко установить ожидания, например:

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

Возвращенный макет будет ожидать сообщения save (что может не иметь смысла в этом случае, но должно дать вам представление).

person szeryf    schedule 04.09.2010