2010-01-19 3 views
15

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

ответ

31

Вы можете сделать это легко без обрезки, изменив переменную среды 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 
1

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

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

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

+0

Почему обнаружения IP: приложение показывает различные элементы пользовательского интерфейса в зависимости от того, пользователь в пределах или за пределами нашего локальная сеть. – Ethan

1

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

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

0

Использование драгоценных камней «мокко» вы можете сделать:

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

 Смежные вопросы

  • Нет связанных вопросов^_^