【问题标题】:How to mock the redirect to an external URL for a integration/acceptance test?如何模拟重定向到外部 URL 以进行集成/验收测试?
【发布时间】:2011-02-11 14:57:48
【问题描述】:

在我的 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

在我的验收测试中(使用steak 和RSpec 2),当水豚跟随指向payment 操作的链接时,我想避免重定向到这个外部URL。基本上我想模拟路由助手payment_path,使其直接指向payment_call_path,并带有适当的subscription_id 参数。

这是正确的方法吗?如果是这样,我该如何模拟 payment_path (找不到怎么做)?

【问题讨论】:

    标签: ruby-on-rails mocking rspec integration-testing


    【解决方案1】:

    虽然我通常会尽量避免在集成测试中进行模拟,但您可以在此处执行以下操作:

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

    使用上面提到的class_eval 会导致该方法在整个运行过程中被永久删除(如果你想要这个,我建议在spec_helper [假设你使用一个spec_helper])。无论如何,我发现使用 rspec 的模拟/存根更可取。

    【讨论】:

      【解决方案2】:

      我不确定这是否是执行此操作的“正确”方式,但您可以存根应用程序的任何代码以返回测试所需的内容。所以在你的 RSpec 测试的某个地方你可以做类似的事情

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

      Here is an example(参见“会话助手方法”部分)#admin?当自定义 RSpec 帮助器模块包含到示例组中时,ApplicationController 中的方法被存根。

      【讨论】:

        猜你喜欢
        • 2012-12-02
        • 1970-01-01
        • 1970-01-01
        • 2022-01-24
        • 2017-01-23
        • 2019-05-21
        • 1970-01-01
        • 1970-01-01
        • 2015-06-15
        相关资源
        最近更新 更多