在Rails项目中(rails 5.2.2,ruby 2.4.1),我定义了2个资源,一个名为“组”,一个名为“产品”。产品对象与“组”有一个belongs_to关系。我想创建一个可以同时测试两种资源的rspec共享示例组,但是我在“产品”的“创建”和“更新”操作上遇到了一些麻烦。
我想设置一组共享的示例组,这些示例组使用用于创建新记录的哈希作为参数。然后可以在“ groups_spec.rb”和“ products_spec.rb”中调用示例组。我同时具有“组”和“产品”的固定装置。以下是“ requests / products_spec.rb”的代码示例,该示例调用了共享的示例:
RSpec.describe "Products", type: :request do
fixtures :groups, :products
it_should_behave_like("modify data checks",
Rails.application.routes.url_helpers.api_products_path,
Product,
{ product: {
name: "New Product",
description: "Test product to add or modify",
group_id: Group.first.id,
label: "NP"
} })
end
end
产品的问题在于,新产品数据需要一个group_id,该组必须在示例组的上下文内有效,但是我必须能够从示例组外部检索group_id才能将其传递。
我猜测真正的答案是重新组织示例组的结构,因此我将对如何重新构建共享示例组提出建议。当然,如果我只是在这里做错了什么,我也会回答。
答案 0 :(得分:0)
我在let
块内使用it_behaves_like
,如下所示:
RSpec.describe "Products", type: :request do
fixtures :groups, :products
# This shared example probably lives in another file, which is fine
# I don't usually pass in args, instead using everything via `let`
shared_example 'modify_data_checks' do
# you have access to all your variables via let inside here
before do
visit(path)
end
expect(model).to be_a(Product)
expect(group_id).to eq(1)
end
it_behaves_like 'modify_data_checks' do
let(:path) { Rails.application.routes.url_helpers.api_products_path }
let(:model) { Product }
let(:group_id) { Group.first.id }
let(:params) {
product: {
name: "New Product",
description: "Test product to add or modify",
group_id: group_id,
label: "NP"
}
}
end
end
您应该能够像这样相对干净地传递数据。我们正在使用类似的模式通过共享示例测试多态关系。