Изменить значение request.remote_ip в Ruby on Rails - PullRequest
11 голосов
/ 08 января 2010

В целях тестирования я хочу изменить возвращаемое значение request.remote_ip. Находясь на моей машине для разработки, он всегда возвращает 127.0.0.1, как и должно быть, но я хотел бы дать себе разные поддельные IP-адреса, чтобы проверить правильность поведения моего приложения без предварительного развертывания его на работающем сервере!

Спасибо.

Ответы [ 7 ]

14 голосов
/ 09 января 2010

Если вы хотите использовать эту функцию во всем приложении, может быть лучше / проще переопределить метод remote_ip в вашем app/helpers/application_helper.rb:

class ActionDispatch::Request #rails 2: ActionController::Request
  def remote_ip
    '1.2.3.4'
  end
end

А адрес 1.2.3.4 доступен везде

5 голосов
/ 09 января 2010

Вы можете немного обмануть, сделав мутатор для значения remote_ip в тестовой среде, которая обычно не определяется.

Например, измените класс внутри test / test_helper.rb следующим образом:

class ActionController::TestRequest
  def remote_ip=(value)
    @env['REMOTE_ADDR'] = value.to_s
  end
end

Затем во время тестирования вы можете переназначить:

def test_something
  @request.remote_ip = '1.2.3.4'
end

Это можно сделать либо в отдельном тесте, либо в рамках вашей процедуры настройки, где это уместно.

Мне приходилось использовать это раньше при написании функциональных тестов, которые проверяют запрет IP, геолокацию и т. Д.

4 голосов
/ 08 января 2010

Вы можете изменить объект запроса, используя:

request = ActionController::Request.new('REMOTE_ADDR' => '1.2.3.4')

request.remote_ip теперь возвращает 1.2.3.4

3 голосов
/ 26 апреля 2017

Для интеграционных испытаний это работает с рельсами 5:

get "/path", params: { }, headers: { "REMOTE_ADDR" => "1.2.3.4" }
3 голосов
/ 18 мая 2013

рельсы 4.0.1 рк. После часа поиска нашел это простое решение при копании в код:)

get '/', {}, { 'REMOTE_ADDR' => '1.2.3.4' }
3 голосов
/ 09 января 2010

Теперь я закончил тем, что поместил этот код в конец файла config/environments/development.rb, чтобы убедиться, что он выполняется только в процессе разработки

# fake IP for manuel testing
class ActionController::Request
  def remote_ip
    "1.2.3.4"
  end
end

Таким образом, это устанавливает remote_ip в 1.2.3.4 при запуске сервера. Каждый раз, когда вы меняете значение, вы должны перезапускать сервер!

0 голосов
/ 24 апреля 2012

Этот ответ работает только для rails3 (я нашел этот ответ, пытаясь ответить на аналогичный вопрос для rails 3),

Так что я опубликую это здесь на случай, если кто-то попытается сделать то же самое в Rails3 env

class ActionDispatch::Request
  def remote_ip
    '1.2.3.4'
  end
end

НТН

...