В тестах контроллера Rails существует ли способ имитировать определенный удаленный IP-адрес?

Некоторые функции в моем приложении работают по-разному в зависимости от IP-адреса клиента. Есть ли способ проверить это в функциональных тестах Rails? Я использую Test:: Unit и Shoulda.

Ответы

Ответ 1

Вы можете сделать это легко без обхода, изменив переменную среды REMOTE_ADDR до вызова контроллера. Здесь вымышленный контроллер, который перенаправляет пользователя на домашний путь, если их IP-адрес равен 1.2.3.4:

def index
  if request.remote_ip == '1.2.3.4'
    redirect_to root_path
    return
  end

  @articles = Article.all
end

Здесь вы можете проверить, что он работает:

def test_should_reject_ip_1_2_3_4
  @request.env['REMOTE_ADDR'] = '1.2.3.4'
  get :index
  assert_redirected_to root_path
end

Вы устанавливаете удаленный ip перед вызовом контроллера, чтобы вы могли подделывать эти данные без каких-либо специальных плагинов или драгоценных камней. И здесь версия toa, для ItemsController:

context "with ip 1.2.3.4" do
  setup do
    @request.env['REMOTE_ADDR'] = '1.2.3.4'
    get :index
  end

  should_not_assign_to :items
  should_redirect_to("home"){home_path}
  should_not_set_the_flash
end

Ответ 2

Приемному контроллеру нужен метод обнаружения IP-адреса (или приема его как параметра), и вам нужен способ ввода определенного IP-адреса для вашего теста или просто указание тестового IP-адреса в качестве параметра для метод.

Если это не так просто, учитывая то, что делает ваше приложение, то вы можете сделать "пользовательские функции" применимыми к другому компьютеру в вашей домашней сети, если он у вас есть, и протестировать приложение таким образом. На самом деле это не решает "решить проблему с помощью unit test".

Могу ли я спросить, почему ваше приложение будет выполнять определенное действие в зависимости от IP-адреса? Возможно, есть другой способ.

Ответ 3

Вы должны выполнить это, заполнив запросы и вернув макет-объект с request.remote_ip равным желаемому IP-адресу.

Я бы посмотрел FakeWeb за помощью. Он позволяет легко настроить ожидаемые запросы/ответы. Также может быть поучительным взглянуть на то, как сам Rails выполняет эти тесты.

Ответ 4

Используя gem "mocha" вы можете сделать:

test "should something" do
  request.expects(:remote_ip).returns("189.81.139.183")
  ...
end