2016-08-24 3 views
1

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

Rspec.shared_context 'JSON request' do 
    let(:headers) do 
    { 
     'Accept' => 'application/json' 
    } 
    end 
end 

Rspec.shared_context 'Authenticated request' do 
    let(:headers) do 
    super().merge('Authorization' => "Bearer #{token}") 
    end 
end 

Rspec.describe 'user management' do 
    let(:token) { create(:oauth_token) } 

    include_context 'JSON request' 
    include_context 'Authenticated request' 

    it 'responds with a 200 ok' do 
    get '/user', headers: headers 
    expect(response).to have_http_status(:ok) 
    end 
end 

Декларирование token работы, как ожидалось, но с использованием super() переопределить headers Возвращает NoMethodError предлагая super() равна нулю.

ответ

2

Я не знаю способа ссылки на текущее значение переменной let в блоке let. (Когда я пытаюсь, я получаю слишком высокий уровень стека.) Я бы сделал то, что вы пытаетесь сделать таким образом:

Rspec.shared_context 'JSON request' do 
    let(:common_headers) do 
    { 
     'Accept' => 'application/json' 
    } 
    end 
    let(:headers) { common_headers } 
end 

Rspec.shared_context 'Authenticated request' do 
    let(:headers) do 
    common_headers.merge('Authorization' => "Bearer #{token}") 
    end 
end 
+0

Отлично, спасибо! –