如何在没有 spec_helper 的 before(:each) 块中获取 RSpec 测试名称

How to fetch RSpec test name in before(:each) block without a spec_helper

下面是一个基本测试套件示例:

describe "Main test suite" do
  it "should run test #1" do
    ...
  end
  it "should run test #2" do
    ...
  end
end

我想添加一个 before(:each),它使用完整的测试名称执行一些特殊逻辑(它将测试名称作为元数据 header 插入到由每次测试)。我发现使用 "#{self.class.description}" 仅捕获测试套件名称(在本例中为“主测试套件”),但我还需要捕获测试名称本身。

我在 Whosebug 上看到了一些其他类似的问题,例如 Getting the full RSpec test name from within a before(:each) block,但答案都涉及向 spec_helper.rb 添加 Spec::Runner.configureRSpec.configure 选项,但是我们 运行 通过不使用 spec_helper.rb 的自定义环境进行这些测试,因此我需要一个不依赖于此的解决方案。

我还看到了其他示例,例如 How to get current context name of rspec 他们在测试本身而不是 before(:each) 块中进行日志记录,因此他们可以做类似的事情:it "should Bar" do |example| puts "#{self.class.description} #{example.description}" end。但是我们有数百个这样的测试,我不想 copy-paste 在每个测试中都使用相同的逻辑——这似乎是 before(:each) 块的理想用例。

我通过将它放在我的文件顶部来让它工作:

RSpec.configure do |config|
    config.before(:each) do |x|
        do_stuff("#{x.class.description} - #{x.example.description}")
    end
end
describe "Main test suite" do
  before(:each) do |x|
    puts "#{x.class.description} - #{x.example.description}"
  end

  it "should run test #1" do
    ...
  end
  it "should run test #2" do
    ...
  end
end