Как установить request.referrer внутри моего RSpec?
Я пытаюсь избежать использования session[:referred_by]
и хотел бы использовать request.referrer
. Однако мои тесты RSpec терпят неудачу, потому что TestRequest
не хранит request.referrer
Поэтому для выполнения тестов Rspec я должен сделать следующее. Есть ли способ сделать это лучше:
referrer = request.referrer ? request.referrer : '/'
redirect_to referrer, :alert => error_message
Ответы
Ответ 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")
Ответ 7
Я попробовал это решение, и оно работает для меня должным образом https://robert-reiz.com/2013/08/09/http_referer-for-rspec-is-missing/