Как смоделировать перенаправление на внешний URL для интеграционного / приемочного теста? - PullRequest
1 голос
/ 11 февраля 2011

В моем приложении на Rails 3 у меня есть контроллер со следующими действиями (упрощенный код):

def payment
  redirect_to some_url_of_an_external_website
end

  # the external website redirects the browser to this action when the payment is done
def payment_callback
  @subscription = Subscription.new(:subscription_id => params[:subscription_id])
  ...
end

В моем приемочном тесте (с использованием стейк и RSpec 2) я хочу избежать перенаправления на этот внешний URL-адрес, когда капибара переходит по ссылке, указывающей на действие payment. В основном я хочу смоделировать помощника по маршруту payment_path, чтобы он напрямую указывал на payment_call_path с соответствующим параметром subscription_id.

Это правильный способ сделать это? Если так, как я могу издеваться над payment_path (не могу найти, как это сделать)?

Ответы [ 2 ]

1 голос
/ 12 февраля 2011

Хотя я обычно стараюсь избегать насмешек в интеграционных тестах, здесь вы можете сделать что-то вроде этого:

MyController.stub!(:payment).and_return('payment received'). 

Использование class_eval, как упомянуто выше, приведет к тому, что этот метод будет постоянно отключен на протяжении всего вашего прогона (если вы этого хотите, я бы предложил заглушить его в spec_helper [при условии, что вы используете spec_helper]). Я считаю, что в любом случае использование rspec-а для насмешек предпочтительнее.

0 голосов
/ 11 февраля 2011

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

MyController.class_eval do
  def payment
    'payment received'
  end
end

Вот пример (см. Раздел «Методы поддержки сеанса»), где находится #admin? Метод в ApplicationController заглушается, когда пользовательский вспомогательный модуль RSpec включен в группу примеров.

...