在嵌套的共享示例rspec中测试多个URL

时间:2018-11-15 15:05:18

标签: ruby-on-rails api rspec

因此,我正在未经测试的代码库上设置rspec。我从端点测试开始。我非常依赖DRY的共享示例。我的设置运行良好,如下所示:(为简化起见)

describe Api::V2::EventsController, type: :api do
  let(:type) { 'events' }
  let(:instance_trait) { :with_events }
  let(:record_count_transiant) { :events_count }

  subject { controller }
  it_behaves_like 'index'
end


RSpec.shared_examples 'index' do
  context 'index without data' do
    it_behaves_like 'empty_index'
  end
end

RSpec.shared_examples 'empty_index' do
  let(:instance) { create :instance }

  before do
    get "/api/v2/#{instance.slug}/#{type}"
  end

  it 'responds with success status' do
    expect(last_response.status).to eq 200
  end
end

但是今天我尝试测试嵌套索引。我的问题是要测试的网址要为shared_examples乘以倍数,所以我不能使用之前执行请求的相同逻辑,因为last_response将是最后一个响应(是)。

我的第一次尝试是遍历it块中的网址,如下所示:

it 'responds with success status' do
  parent_types.each do |parent_type|
    get "/api/v2/#{instance.slug}/#{parent_type}/#{instance.send(parent_type).first.uuid}/#{type}"

    expect(last_response.status).to eq 200
  end
end

这不起作用,因为在运行期望时请求显然没有结束。

所以我的第二个尝试是循环访问父共享示例,并将url作为变量传递:

RSpec.shared_examples 'nested_index' do
  context 'index without data' do
    it 'is nested in shows' do
      parent_types.each do |parent_type, parent_config|
        instance = create :instance, parent_config[:trait]

        url = "/api/v2/#{instance.slug}/#{parent_type}/#{instance.send(parent_type).first.uuid}/#{type}"
        it_behaves_like 'empty_nested_index', url
      end
    end
  end
end

但是出现错误:it_behaves_like在一个示例中不可用。 (例如it块)

如果我不在it块中,那么我将无法访问let变量,因此有点卡住了。任何有关重组我的测试的技巧都将不胜感激。

0 个答案:

没有答案