如何在共享上下文之间共享RSpec let变量?

时间:2016-08-24 10:32:04

标签: ruby rspec

我试图通过使用共享上下文来干我的RSpec请求规范。我希望在共享上下文之间共享let个变量,以便它们可以相互继承和扩展。

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 个答案:

答案 0 :(得分:3)

我不知道如何在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 变量值。 (当我尝试它时,我得到"堆叠水平太深"。)我做你正在尝试这样做的事情:

{“readyState”:0,“responseText”:“”,“status”:0,“statusText”:“error”}

答案 1 :(得分:0)

您可以使用super()来获取预定义的let的值:

RSpec.shared_context 'common' do
  let(:foo) { 'foo' }
end

RSpec.describe 'test' do
  include_context 'common'

  context 'reversed' do
    let(:foo) { super().reverse }

    it 'works' do
      expect(foo).to eq('oof')
    end
  end
end