Как я могу проверить объект запроса, используя определенный URL в application_helper_spec.rb? - PullRequest
3 голосов
/ 25 июня 2011

У меня есть метод, определенный в application_helper.rb, который возвращает канонический URL на основе текущего запроса.Как я могу издеваться или иным образом указывать полный URL для контроллера?

# spec/helpers/application_helper_spec.rb
describe "#canonical_url" do
  it "should return a path to an asset that includes the asset_host" do
    # Given: "http://www.foo.com:80/asdf.asdf?asdf=asdf"
    helper.canonical_url().should eq("http://www.foo.com/asdf.asdf")
  end
end

# app/helpers/application_helper.rb
def canonical_url
  "#{request.protocol}#{request.host}#{(request.port == 80) ? "" : request.port_string}#{request.path}"
end

EDIT :

В конечном итоге я хочу проверить, что canonical_url () возвращает правильную строкудля множества разных URL-адресов, некоторые с портами, некоторые без /, некоторые со строками запросов, некоторые с путями и т. д. Может быть, это излишне, но это конечная цель.Я хотел бы явно указать заглушку / макет / любой начальный URL, а затем явно установить ожидание в сопоставителе.Я бы хотел сделать это за один звонок, то есть controller.request.url = 'http://www.foo.com:80/asdf.asdf?asdf=asdf' или request = ActionController::TestRequest.new :url => 'http://www.foo.com:80/asdf.asdf?asdf=asdf', но до сих пор я не нашел ни одного "крючка", который позволил бы мне это сделать.Так что это решение, которое я ищу. Как явно указать URL-адрес запроса для данного теста.

Ответы [ 3 ]

7 голосов
/ 25 июня 2011

Я бы сделал:

helper.request.stub(:protocol).and_return("http://")
helper.request.stub(:host).and_return("www.foo.com")
helper.request.stub(:port).and_return(80)
helper.request.stub(:port_string).and_return(":80")
helper.request.stub(:path).and_return("/asdf.asdf")
helper.canonical_url.should eq("http://www.foo.com/asdf.asdf")
2 голосов
/ 18 августа 2011

Конечная причина этой путаницы лежит в ActionPack:

  • ActionDispatch :: TestRequest
  • ActionDispatch :: Http :: URL

например. если вы установите порт (ActionDispatch :: TestRequest)

def port=(number)
  @env['SERVER_PORT'] = number.to_i
end

например. затем вы читаете его (ActionDispatch :: Http :: URL)

def raw_host_with_port
  if forwarded = env["HTTP_X_FORWARDED_HOST"]
    forwarded.split(/,\s?/).last
  else
    env['HTTP_HOST'] || "#{env['SERVER_NAME'] || env['SERVER_ADDR']}:#{env['SERVER_PORT']}"
  end
end

Настройка SERVER_PORT вступит в силу только в том случае, если вы еще не настроили SERVER_NAME, HTTP_X_FORWARDED_HOST или HTTP_HOST.

Мой основной обходной путь для настройки порта состоял в том, чтобы добавить порт к хосту - потому что request.port обычно не делает то, что вы хотите.

например. установить порт

request.host = 'example.com:1234'

Реальный ответ - прочитать код в ActionPack; это довольно просто.

0 голосов
/ 06 сентября 2016

Очень поздно на эту вечеринку, но обнаружил, что она гуглит что-то похожее.

Как насчет:

allow_any_instance_of(ActionController::TestRequest).to receive(:host).and_return('www.fudge.com')

Я ценю, что allow_any_instance_of иногда осуждают, но, похоже, это становитсяработа сделана.

...