我正在尝试通过使用Rspec configuration block将它们包含在一个单独的文件中,为我的所有规范定义一些全局运行的let
和before
个钩子。
我尝试过类似的事情:
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
。我想要一个单独的地方,我可以定义这两个东西,而不是污染我的规范助手,但只是包括它。
答案 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个瓶子。