Как я могу получить доступ к метаданным в rspec before (: all)?

Я хотел бы иметь возможность отображать имя тестовой группы (и родословную) во время метода before (: all):

describe "My awesome app" do
  before(:all) do
    puts running_example_group.metadata[:full_description] # <- what I'm imagining
    ...
  done
  ...
  describe "awesome widget" do
    before (:all) do
      puts running_example_group.metadata[:full_description] # <- what I'm imagining
      ...
    done
    ...
  done
done

Идея заключается в том, что вывести результат:

My awesome app
My awesome app awesome widget

Эти данные доступны внутри предложений "it", но я не могу понять это раньше (: все). Разве это недоступно? Я просто ошибаюсь?

Ответ 1

Внутри блока before(:all) нет "запускаемого примера", но вы можете получить доступ к метаданным через RSpec::Core::ExampleGroup. Вот пример того, как вы можете получить доступ к метаданным из разных областей:

describe "My app", js: true do

  context "with js set to #{metadata[:js]}" do
    before :all do
      puts "in before block: js is set to #{self.class.metadata[:js]}"
    end

    it "works" do
      puts "in example: js is set to #{example.metadata[:js]}"
    end
  end

end

Для получения дополнительной информации, пожалуйста, взгляните на этот комментарий в rspec/rspec-core # 42.

Ответ 2

Это не совсем ответ на первоначальный вопрос, но это связано, и это был первый пост, связанный с моим поиском в Google, поэтому я хотел бы поделиться тем, что я только что выяснил.

В моем случае я искал способ запуска некоторых команд в before(:suite)/before(:all), но только в том случае, если выполняемые тесты включали в себя некоторые системные тесты (или примеры с определенными метаданными). Вот что я придумала:

RSpec.configure do |config|
  config.before(:suite) do
    examples = RSpec.world.filtered_examples.values.flatten
    has_system_tests = examples.any? { |example| example.metadata[:type] == :system }

    if has_system_tests
      ...
    end
  end
end