Подтвердить что ты не робот

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, похоже, не решает эту проблему.

Любая помощь будет принята с благодарностью.

4b9b3361

Ответ 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 параметров...