因此,我正在未经测试的代码库上设置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变量,因此有点卡住了。任何有关重组我的测试的技巧都将不胜感激。