В тестах контроллера Rails, есть ли способ имитировать определенный удаленный IP? - PullRequest
15 голосов
/ 19 января 2010

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

Ответы [ 4 ]

31 голосов
/ 19 января 2010

Вы можете сделать это легко, не заглушая, изменив переменную окружения 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 перед вызовом контроллера, поэтому вы можете подделать эти данные без каких-либо специальных плагинов или гемов. А вот версия musta для 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 голос
/ 19 января 2010

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

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

1 голос
/ 19 января 2010

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

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

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

0 голосов
/ 05 июля 2012

Используя гем "мокко", вы можете сделать:

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