如何在(:all)之前访问rspec中的元数据?

时间:2011-10-12 16:26:31

标签: ruby rspec2

我希望能够在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”子句中可用,但我无法弄清楚之前(:all)。它不可用吗?我只是犯了一个愚蠢的错误吗?

3 个答案:

答案 0 :(得分:12)

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

有关详细信息,请查看this comment in rspec/rspec-core#42

答案 1 :(得分:1)

这并不能完全回答最初的问题,但这是相关的,这是与我的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

答案 2 :(得分:0)

使用rspec-core 3.7,您可以简单地访问before的第二个参数元数据

RSpec.configure do |config|
  config.before(:all, type: :job) do 
    # do what you want to do
  end
end