开发者

How to mock the redirect to an external URL for a integration/acceptance test?

开发者 https://www.devze.com 2023-02-10 03:51 出处:网络
In my Rails 3 application I have a controller with the following actions (code simplified): def payment

In my Rails 3 application I have a controller with the following actions (code simplified):

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

In my acceptance test (using steak and RSpec 2), I want to avoid the redirection to this external URL when capybara follows the link pointing to the payment action. Basically I want to mock the route helper payment_path so that it directly points to the payment_call_path with the appropriate subscription_id parameter.

Is this the correct way to do it? If so, h开发者_JAVA技巧ow can I mock the payment_path (could not find how to do it)?


Whilst I usually try to avoid mocking in integration tests, here you can do something like this:

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

Using class_eval as mentioned above will lead to that method being permanently stubbed out across your entire run (if you want this, I'd suggest stubbing it in spec_helper [that's assuming you use a spec_helper]). I find using rspec's mocking/stubbing stuff preferable anyway.


I'm not sure if this is the 'correct' way of doing this, but you can stub any of your application's code to return what you need for your test. So somewhere in your RSpec test you can do something like

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

Here is an example (see section 'Session Helper Methods') where the #admin? method in ApplicationController is stubbed when a custom RSpec helper module is included into the example group.

0

精彩评论

暂无评论...
验证码 换一张
取 消