Некоторые функции в моем приложении работают по-разному в зависимости от IP-адреса клиента. Есть ли способ проверить это в функциональных тестах Rails? Я использую Test :: Unit и Shoulda.В тестах контроллера Rails, есть ли способ имитировать определенный удаленный IP-адрес?
ответ
Вы можете сделать это легко без обрезки, изменив переменную среды 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 перед вызовом контроллера, поэтому вы можете подделать эти данные без каких-либо специальных плагинов или драгоценных камней. А вот версия Shoulda для 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
Принимающий контроллер нуждается в способе обнаружения IP-адреса (или приема его в качестве параметра), и вам нужен способ ввода определенного IP-адреса для вашего теста или просто указание тестового IP-адреса в качестве параметра для метод.
Если это не так просто, учитывая то, что делает ваше приложение, что вы можете сделать, это сделать «пользовательские функции» применимыми к другому компьютеру в вашей домашней сети, если он у вас есть, и протестировать приложение таким образом. Тем не менее, это действительно не решает проблему «решить проблему с помощью единичного теста».
Могу ли я спросить, почему ваше приложение будет выполнять определенное действие в зависимости от IP-адреса? Возможно, есть и другой способ.
Вы должны быть в состоянии выполнить это, выполняя запросы и возвращая макет объекта, который имеет request.remote_ip
, равный желаемому IP-адресу.
Я бы посмотрел на FakeWeb за помощью. Он позволяет легко настроить ожидаемые запросы/ответы. Также может быть поучительно посмотреть, как Rails сам does these kinds of tests.
Использование драгоценных камней «мокко» вы можете сделать:
test "should something" do
request.expects(:remote_ip).returns("189.81.139.183")
...
end
Почему обнаружения IP: приложение показывает различные элементы пользовательского интерфейса в зависимости от того, пользователь в пределах или за пределами нашего локальная сеть. – Ethan