Подтвердить что ты не робот

Как установить request.referrer внутри моего RSpec?

Я пытаюсь избежать использования session[:referred_by] и хотел бы использовать request.referrer. Однако мои тесты RSpec терпят неудачу, потому что TestRequest не хранит request.referrer

Поэтому для выполнения тестов Rspec я должен сделать следующее. Есть ли способ сделать это лучше:

referrer = request.referrer ? request.referrer : '/'
redirect_to referrer, :alert => error_message
4b9b3361

Ответ 1

Отметьте это:

specify 'foo' do
  controller.request.should_receive(:referer).and_return('http://example.com')
  # get whatever
end

Или, если вам все равно, если он не вызван, закройте его:

controller.request.stub referer: 'http://example.com'

Ответ 2

ActionDispatch::TestRequest extends ActionDispatch::Request, который расширяет Rack::Request.

Метод определяется следующим образом

def referer
  @env['HTTP_REFERER']
end
alias referrer referer

Насколько я помню, вы можете получить доступ к переменной среды в тесте RSpec, используя request.env. Это означает, что должно быть возможно установить что-то вроде

request.env['HTTP_REFERER'] = 'http://example.com'

Конечно, это зависит от типа группы примеров RSpec, которую вы используете.

Ответ 3

В Rails 5 принятое решение, похоже, не работает anyore, но устанавливает request.env['HTTP_REFERER'] напрямую, как предлагает Simone Carletti.

Ответ 4

С Rails4/Rspec3, в спецификации запроса, request недоступен, пока вы не сделаете http-вызов. Но вы можете назначить request.referer, выполнив что-то вроде этого:

get '/posts', {}, { referer: 'http://example.com' }

Ответ 5

Решение для Rails 5. 2+ и RSpec 3. 8+

get :endpoint, params: {}, headers: { 'HTTP_REFERER' => 'stackoverflow.com' }

Ответ 6

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

allow(view).to receive_message_chain(:request, :referrer).and_return("http://example.com")