Web 模拟不适用于 Rails 控制器中的 redirect_to

Web mock does not work with redirect_to in Rails controller

我的控制器有这段代码:

class MyController < App::BaseController
  def login
    redirect_to 'https://some.api.com/auth?params'
  end
end

当然我不想在测试中被重定向到外部网站。所以我决定添加 webmock gem 并添加:

WebMock.disable_net_connect!(allow_localhost: true)

给我的 spec_helper.rb.

在我的功能测试中,我有:

  scenario 'stubbing external api' do
    visit '/connect_to_some_external_api'
    stub_request(:any, /https:\/\/some.api.com\/auth\//)
      .to_return(status: 200, body: 'DUPA. A nawet DUPA123')
    # this works as intended  ->Net::HTTP.get('https://some.api.com/auth/')
    click_link 'Get me to MyController#login'
  end

当我调用 Net::HTTP.get('https://some.api.com/auth/') 时,我得到响应 "DUPA. A nawet DUPA123"。这很酷!这意味着 stub_request 有效。

问题是当用户单击 link 到 MyController#get 时发生重定向。它不会存根请求,只是让浏览器重定向到外部应用程序。

是否可以存根来自控制器 redirect_to 的请求?如果是,那又如何?

在功能测试中,请求来自浏览器,因此您无法使用 stub_request 在服务器上模拟请求。您应该在 controller/request 规范中验证重定向。如果您真的需要在功能测试中对此进行测试,最灵活的解决方案是使用像 puffing-billy

这样的可编程代理