Rspec rails:如何测试控制器操作是否使用修改后的参数正确重定向到自身一次?

Rspec rails: How do I test if a controller action redirects correctly to itself with modified params once?

我有一个控制器操作(基于查询参数)可能会使用一些修改后的参数重定向到自身

class SearchController < ApplicationController
  def search
    if params[:deprecated_param].present?
      params[:new_param] = params.delete(:deprecated_param)
      redirect_to search_path(params), status: :moved_permanently and return
    end
  end
end

现在我想做两个这样的测试:

require 'spec_helper'

describe SearchController, type: :controller do
  describe 'GET #search' do
    render_views
    context 'a deprecated param is used' do
      it 'should do a redirect' do
        get :search, deprecated_param: 'yes'
        expect(response).to redirect_to("http://mydomain.test/search?new_param=yes") # .once ?
        # expect(final response after redirect).to have_http_status(200)
      end
    end
    context 'when no deprecated param is used' do
      it 'should not do any redirects' do
        get :search, new_param: 'yes'
        expect(response).not_to #... redirect_anywhere?
        expect(response).to have_http_status(200)
      end
    end
  end
end

但是它们不起作用。有两个问题:

  1. 在第一个测试中:我似乎无法在重定向后再次点击相同的操作之前测试中间重定向。
  2. 在第二个测试中:我找不到一种方法来测试根本没有发生重定向。

我找到了这个相关问题,但没有解决。 RSpec testing redirect to URL with GET params

对于第二个,我想你可以测试以下内容:

expect(response).to render_template(:your_template)

只需添加预期的模板,如果您不希望重定向,只需在您希望保留的位置添加模板。

对于第一个,我不确定是否真的理解你需要什么,但我尽量建议你使用以下代码:

describe SearchController, type: :request do
# ...
it 'should do a redirect' do
  get "/search", deprecated_param: 'yes'
  expect(response).to redirect_to("http://mydomain.test/search?new_param=yes")
  follow_redirect!
  expect(response).to have_http_status(200)
  expect(response).to render_template(:your_template) #just to be sur you are on the expected page
end

follow_redirect! 遵循单个重定向响应。如果最后的响应不是重定向,将引发异常。