Имитация нелокального запроса в тестировании запросов Rails / RSpec - PullRequest
3 голосов
/ 04 января 2011

Я бы хотел заблокировать доступ к приложению всем нелокальным запросчикам (на практике реальная функциональность моего приложения более сложная, но решение этой проблемы решит мою конкретную проблему). Как мне провести тестирование с помощью тестов запросов в RSpec?

В spec/requests/gatekeeper_spec.rb

describe "A local request to the site root" do
  before :each do
    get root_path
  end
  it "should not allow access" do
    response.status.should be(401)
  end
end

describe "An external (terminology?) request to the site root" do
  before :all do
    # TODO: make request remote
  end
  before :each do
    get root_path
  end
  it "should allow access" do
    response.status.should be(200)
  end
end

Как мне реализовать строку # TODO? Я изучал макеты и думаю, что такелаж request.remote_ip может быть уместным, но я не уверен, как именно реализован такой макет.

Ответы [ 3 ]

2 голосов
/ 10 января 2011

Если я правильно понимаю, тестовые запросы имеют удаленный адрес "0.0.0.0", поэтому они обычно считаются удаленными, и вы захотите заблокировать локальные запросы, а не наоборот.

Я думаю, что это должно работать для спецификаций контроллера - не уверен насчет спецификации запроса:

request.stub(:local?) { true }
2 голосов
/ 04 января 2011

Не проверено, но должно работать в Rails 2.3.x и 3.0:

before :each do
  Rails::Initializer.run do |config|
    config.action_controller.consider_all_requests_local = false
  end
end

after :each do
  Rails::Initializer.run do |config|
    config.action_controller.consider_all_requests_local = true
  end
end
1 голос
/ 12 мая 2014

В Рельсы 4 Вы можете сделать это с:

RSpec.configure do |config|
  config.before(:each, allow_rescue: true) do
    Rails.application.config.action_dispatch.stub(:show_exceptions) { true }
    Rails.application.config.stub(:consider_all_requests_local) { false }
  end
end

А потом в вашем тестовом файле:

describe "A test" do
  it "renders custom error pages", :allow_rescue => true do
    # ...
  end
end

Имя :allow_rescue взято из конфигурации ActionController::Base.allow_rescue, существующей в Rails 3 , и там конфигурация RSpec будет:

RSpec.configure do |config|
  config.before(:each, allow_rescue: true) do
    ActionController::Base.stub(:allow_rescue) { true }
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...