使用RSpec共享的示例组和belongs_to关联

时间:2018-12-18 02:28:41

标签: ruby-on-rails ruby rspec rspec-rails

在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才能将其传递。

我猜测真正的答案是重新组织示例组的结构,因此我将对如何重新构建共享示例组提出建议。当然,如果我只是在这里做错了什么,我也会回答。

1 个答案:

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

您应该能够像这样相对干净地传递数据。我们正在使用类似的模式通过共享示例测试多态关系。