2015-10-11 4 views
0

Я пытаюсь проверить приложение Rails с помощью RSpec, но мои тесты не работают, потому что RSpec, похоже, не передает заголовки, которые я передаю Rails.Почему RSpec не передает мои заголовки Rails?

У меня есть UsersController, который включает в себя ApplicationHelper, а в ApplicationHelper У меня есть метод, который обращается к кешу headers. Индексирование его моим SESSION_KEY заголовком возвращает nil. Если I puts headers внутри этого метода, хэш не содержит заголовок, который я поставил, только следующее: {"X-Frame-Options"=>"SAMEORIGIN", "X-XSS-Protection"=>"1; mode=block", "X-Content-Type-Options"=>"nosniff"}.

Вот соответствующая часть моей RSpec спецификации:

require 'rails_helper' 

describe Api::V1::UsersController, type: :request do 
    let(:user) { User.create(name: 'TestUser', email: '[email protected]', password: 'password123', password_confirmation: 'password123') } 
    let(:id) { user.id } 
    let(:sess) { user.sessions.create } 

    before { get "/api/v1/users/#{id}" } 

    # Snipped other tests 

    context 'with authentication' do 
    context 'with a valid id' do 
     it 'returns full user information' do 
     get "/api/v1/users/#{id}", nil, {'HTTP_SESSION_KEY': sess.key} 
     response_user = response_json[:user] 
     expect(response.status).to eq 200 
     expect(response_user).to_not be_nil 
     expect(response_user[:name]).to eq user[:name] 
     expect(response_user[:email]).to eq user[:email] 
     end 
    end 
    end 

    def response_json 
    JSON.parse(response.body, symbolize_names: true) 
    end 
end 

Я также попытался пропусканием заголовок SESSION_KEY без HTTP_ перед ним, и это не сработало. Я также попытался переместить его на верхнюю часть get в блок before, чтобы убедиться, что это проблема контекста, и это тоже не сработало.

+0

Обратите внимание, что '{'HTTP_SESSION_KEY': sess.key} должен быть с hashrocket:' {'HTTP_SESSION_KEY' => sess.key} ' – nsave

+0

@nsave На секунду я подумал, что это могло быть источником моих проблем, но это не ... Любая идея, что может быть? – AppleDash

+0

Кажется, вы делаете два запроса 'get' каждый раз, сначала в блоке' before', а второй - в 'it'. Это намеренно? –

ответ

1

Docs говорят выше должно работать, но если по каким-то причинам RSpec интерпретирует тест как тест :controller, а не тест :request, то вам нужно сделать это (как раз перед вашим get вызова):

request.env["HTTP_SESSION_KEY"] = sess.key 
+0

Это не похоже на что-либо, хеш-память заголовков остается неизменной в соответствии с контроллером. – AppleDash

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