Использование общих групп примеров RSpec с ассоциациями own_to - PullRequest
0 голосов
/ 18 декабря 2018

В проекте Rails (rails 5.2.2, ruby ​​2.4.1) у меня определены 2 ресурса, один с именем "groups" и один с именем "products".Объекты продукта имеют отношение принадлежат к группе.Я хотел создать группу общих примеров rspec, которая может тестировать оба ресурса, но у меня возникли некоторые проблемы с действиями «создать» и «обновить» для «продуктов».

Я хотел настроить общий наборпримеров групп, которые принимают хеш, используемый для создания новой записи в качестве параметра.Затем группу примеров можно вызывать как в «groups_spec.rb», так и в «products_spec.rb».У меня есть приспособления для «групп» и «продуктов». Ниже приведен пример кода для «request / 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

Проблема с продуктами заключается в том, что новыйДля данных продукта требуется идентификатор_группы, который должен быть действительным внутри контекста группы примеров, но я должен быть в состоянии получить идентификатор_группы извне группы примеров, чтобы передать его.

Я предполагаю, чтоРеальный ответ состоит в том, чтобы реорганизовать структуру группы примеров, поэтому я приму рекомендацию о том, как реструктурировать общую группу примеров. Конечно, если я просто делаю что-то не так, я тоже приму этот ответ.

1 Ответ

0 голосов
/ 18 декабря 2018

Я использую 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

Вы должны иметь возможность передавать данные относительно чисто, как это.Мы используем шаблон, похожий на этот, для тестирования полиморфных отношений с помощью общих примеров.

...