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
但是它们不起作用。有两个问题:
- 在第一个测试中:我似乎无法在重定向后再次点击相同的操作之前测试中间重定向。
- 在第二个测试中:我找不到一种方法来测试根本没有发生重定向。
我找到了这个相关问题,但没有解决。
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!
遵循单个重定向响应。如果最后的响应不是重定向,将引发异常。
我有一个控制器操作(基于查询参数)可能会使用一些修改后的参数重定向到自身
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
但是它们不起作用。有两个问题:
- 在第一个测试中:我似乎无法在重定向后再次点击相同的操作之前测试中间重定向。
- 在第二个测试中:我找不到一种方法来测试根本没有发生重定向。
我找到了这个相关问题,但没有解决。 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!
遵循单个重定向响应。如果最后的响应不是重定向,将引发异常。