RSpec тестирует перенаправление на URL с параметрами GET
Скажем, у меня есть FoosController
с методом redirect_to_baz
.
class FoosController < ApplicationController
def redirect_to_baz
redirect_to 'http://example.com/?foo=1&bar=2&baz=3'
end
end
Я тестирую это с помощью spec/controllers/foos_controller_spec.rb
:
require 'spec_helper'
describe FoosController, :type => :controller do
describe "GET redirect_to_baz" do
it "redirects to example.com with params" do
get :redirect_to_baz
expect(response).to redirect_to "http://example.com/?foo=1&bar=2&baz=3"
end
end
end
Это работает. Однако, если кто-то меняет параметры строки запроса (например, http://example.com/?bar=2&baz=3&foo=1
), тест терпит неудачу.
Какой правильный способ проверить это?
Я хотел бы сделать что-то вроде:
expect(response).to redirect_to("http://example.com/", params: { foo: 1, bar: 2, baz: 3 })
Я посмотрел документацию , и я попытался найти response.parameters
, но я не нашел ничего подобного. Даже Hash#to_query
, похоже, не решает эту проблему.
Любая помощь будет принята с благодарностью.
Ответы
Ответ 1
Из документации ожидаемый путь перенаправления может соответствовать регулярному выражению:
expect(response).to redirect_to %r(\Ahttp://example.com)
Чтобы проверить, что строка запроса запроса на перенаправление кажется немного более запутанной. У вас есть доступ к месту ответа, поэтому вы должны это сделать:
response.location
# => http://example.com?foo=1&bar=2&baz=3
Вы должны иметь возможность извлекать параметры querystring следующим образом:
redirect_params = Rack::Utils.parse_query(URI.parse(response.location).query)
# => {"foo"=>"1", "bar"=>"2", "baz"=>"3"}
И из этого должно быть просто проверить правильность параметров перенаправления:
expect(redirect_params).to eq("foo" => "1", "baz" => "3", "bar" => "2")
# => true
Если вам нужно делать такую логику более одного раза, было бы удобно, чтобы все это превратилось в пользовательский сокет rspec.
Ответ 2
Можете ли вы использовать помощники маршрута, а не просто строку? Если это так, вы можете просто передать хэш-параметры помощнику маршрута, и они будут преобразованы в параметры строки запроса:
root_url foo: 'bar', baz: 'quux'
=> "http://www.your-root.com/?baz=quux&foo=bar"
expect(response).to redirect_to(root_url(foo: 'bar', baz: 'quux'))
Помогает ли это, или вы ограничены использованием строк, а не помощников маршрутов?
Другая мысль заключается в том, что вы можете просто утверждать непосредственно значения в хэше params, а не строку url + query, поскольку параметры строки запроса будут сериализованы в hash параметров...