所有规格的rspec shared_context和include_context

时间:2012-04-01 14:25:21

标签: ruby testing rspec

我正在尝试通过使用Rspec configuration block将它们包含在一个单独的文件中,为我的所有规范定义一些全局运行的letbefore个钩子。

我尝试过类似的事情:

module Helpers
  def self.included(base)
    base.let(:x){ "x" }
    base.before(:all){ puts "x: #{x}" }
  end
end

Rspec.configure{|c| c.include Helpers }

但是这不能按预期工作。 before(:all)不仅在每个主要示例组之前运行,而且每个都嵌套一个。

然后我发现了shared_context,它似乎正是我想要的。

我的开放性问题是,我无法弄清楚如何在我的规范的 ALL 之间共享上下文。文档仅在特定规范中引用include_context

有谁能告诉我如何以全球方式实现这种行为?我知道我可以在我的spec_helper中定义全局挂钩,但我似乎无法使用let。我想要一个单独的地方,我可以定义这两个东西,而不是污染我的规范助手,但只是包括它。

1 个答案:

答案 0 :(得分:2)

我尝试重现您的错误,但失败了。

# spec_helper.rb
require 'support/global_helpers'

RSpec.configure do |config|
  config.include MyApp::GlobalHelpers
end

# support/global_helpers.rb
module MyApp
  module GlobalHelpers
    def self.included(base)
      base.let(:beer) { :good }
      base.before(:all) { @bottles = 10 }
    end
  end  
end

# beer_spec.rb
require 'spec_helper'

describe "Brewery" do

  it "makes good stuff" do
    beer.should be :good
  end

  it "makes not too much bottles" do
    @bottles.should == 10
  end

  context "when tasting beer" do
    before(:all) do
      @bottles -= 1
    end

    it "still produces good stuff" do
      beer.should be :good
    end

    it "spends some beer on degusting" do
      @bottles.should == 9
    end   
  end
end

https://gist.github.com/2283634

当我写了类似base.before(:all) { p 'global before'; @bottles = 10 }的内容时,我在规范输出中只得到了一行。

请注意,我没有尝试修改示例中的实例变量,因为it wouldn't work anyway(实际上你可以修改实例变量,如果它是哈希或数组)。此外,即使您将嵌套示例组中的before(:all)更改为before(:each),每个示例中仍会有9个瓶子。