Совместное использование кода между спецификациями просмотра

#rspec #rspec-rails

#rspec #rspec-rails

Вопрос:

У меня есть несколько спецификаций просмотра: редактировать, индексировать, создавать, показывать для данного контроллера Rails (3), и я хотел бы, чтобы часть стандартного кода настройки была разделена между ними. Я бы хотел избежать размещения его в файле spec_helper.rb. Есть идеи?

Чтобы быть более конкретным, в спецификации / представлениях / шагах у меня есть четыре файла: {редактировать, создать, показать, индекс}.html.erb_spec.rb. Я хотел бы, чтобы они поделились некоторым кодом, таким как

   let(:workflow) do
    document = Factory.create(:document)
    document.user = user
    document.save!
    document.workflow
  end
  

Например — точный код не имеет значения. Я хотел бы сделать это, не помещая его в spec_helper.rb.

Ответ №1:

Вы обнаружите, что в rspec есть именно то, что нужно для этого: общий контекст.

Это позволит вам сделать что-то вроде этого

 shared_context 'workflow' do
  let(:workflow) do
    document = Factory.create(:document)
    document.user = user
    document.save!
    document.workflow
  end
end
  

Если вам нужно разделить это между разными файлами спецификаций, запишите это в файл, который вы храните внутри spec/support . Затем в своем тесте вы можете написать:

 describe 'Something' do
  include_context 'workflow'

  it 'behaves correctly' do
    ...
  end
end
  

Надеюсь, это поможет.

Комментарии:

1. обратите внимание, что spec/support папка — это просто соглашение, и Rspec не будет автоматически запрашивать файлы из нее, поэтому вам нужно require 'spec/support/filey'

2. Верно. Обычно я включаю следующую строку в свой rails_helper.rb (раньше это был spec_helper) : Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }

Ответ №2:

Может быть, вы могли бы использовать shared context :https://www.relishapp.com/rspec/rspec-core/docs/example-groups/shared-context