块范围前的Rspec不一致



我在使用RSpec的"before(:all)"块时遇到范围问题。

以前我使用的是before(:each),它运行良好:

module ExampleModule
    describe ExampleClass
        before(:each) do
            @loader = Loader.new
        end
        ...

       context 'When something' do

            before(:each) do
                puts @loader.inspect # Loader exists
                # Do something using @loader
            end
            ...
        end
    end
end

但是在(:all)之前切换嵌套的before(:each) block to意味着加载器为nil:

module ExampleModule
    describe ExampleClass
        before(:each) do
            @loader = Loader.new
        end
        ...

        context 'When something' do

            before(:all) do
                puts @loader.inspect # Loader is nil
                # Do something using @loader
            end
            ...
         end
    end
end

那么为什么@loader nil在before(:all)块中,而不在before(:each)块中呢

所有:all块发生在任何:each块之前:

describe "Foo" do
  before :all do
    puts "global before :all"
  end
  before :each do
    puts "global before :each"
  end
  context "with Bar" do
    before :all do
      puts "context before :all"
    end
    before :each do
      puts "context before :each"
    end
    it "happens" do
      1.should be_true
    end
    it "or not" do
      1.should_not be_false
    end
  end
end

输出:

rspec -f d -c before.rb
Foo
global before :all
  with Bar
context before :all
global before :each
context before :each
    happens
global before :each
context before :each
    or not

根据钩子的Rspec文档,before :all钩子在before :each之前运行。

最新更新