В тестах контроллера 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