在上下文或描述之前未调用块之前的RSpec

时间:2017-07-10 17:29:35

标签: ruby selenium-webdriver rspec tdd

给出以下代码:

RSpec.configure do |config|
  config.before(:all) { puts 'before all' }
  config.before(:suite) { puts 'before suite'}
  config.before(:context) { puts 'before context'}
  config.before(:each) { puts 'before each'}
end


RSpec.describe "SomeClass" do
  it 'matches some regex' do
    puts 'in first it block'
    expect('some string').to match(/.*/)
  end

  describe 'some group of tests' do
    puts 'in some group'

    context 'when some thing happens' do
      puts 'in context'
      it 'does something' do
        expect(true).to be_truthy
      end
    end
  end
end

我希望得到以下结果:

before suite
before all
before context
before each
in some group
in context
in first it block
.before each

但我得到了:

in some group
in context
before suite
before all
before context
before each
in first it block
.before each

意味着contextdescribe在我设置的任何配置之前运行。

我希望它是第一个输出,因为我读过herehere

当我绝对需要在测试文件中的其他任何内容之前运行代码时,我该怎么办?包括(嵌套)上下文还是描述?为什么它不像我期望的那样工作?

注意:当我将before :something语句包含在最高describe范围内时,我会看到相同的行为。

(这个问题类似于this question,但不一样。我想知道为什么我的测试以这种方式运行,以及正确的RSpec约定是什么才能在绝对之前运行一段代码。 )

版本信息:

RSpec 3.6
  - rspec-core 3.6.0
  - rspec-expectations 3.6.0
  - rspec-mocks 3.6.0
  - rspec-support 3.6.0

更新

了解一些上下文可能会有所帮助:我正在使用selenium-webdriver gem编写selenium前端自动化测试。在运行任何和所有it块之前,我需要调用一个名为navigate()的函数(为了将我带到我正在编写测试的网页,此函数需要大约30秒才能运行因为在它到达需要去的地方之前它需要通过两个登录页面才能在其他任何事情发生之前被调用和完成。在我的RSpec文件中,我正在使用before块来尝试实现这一点,但是rspec在before块之前继续运行测试,并且失败。

1 个答案:

答案 0 :(得分:1)

如果您要将puts "in some group"puts "in context"放入before(:all)块,那么输出将更接近您的预期。

RSpec.configure do |config|
  config.before(:all) { puts 'before all' }
  config.before(:suite) { puts 'before suite'}
  config.before(:context) { puts 'before context'}
  config.before(:each) { puts 'before each'}
end


RSpec.describe "SomeClass" do
  it 'matches some regex' do
    puts 'in first it block'
    expect('some string').to match(/.*/)
  end

  describe 'some group of tests' do
    before(:all) { puts 'in some group' }

    context 'when some thing happens' do
      before(:all) { puts 'in context' }

      it 'does something' do
        expect(true).to be_truthy
      end
    end
  end
end

输出

before suite
before all
before context
before each
in first it block
.in some group
in context
before each
.

或者,如果你before(:each),你会得到

before suite
before all
before context
before each
in first it block
.before each
in some group
in context
.

当前输出的原因是“在某些组中”puts语句和“在上下文中”正在执行文件解析时执行,而不是等待RSpec。如果我们给出了一个不同的例子,在混合中没有Rspec,想象我们有一个只有

的文件
class SomeClass
  puts "in class"

  def do_something
    puts "doing something"
  end
end

如果我们将该文件加载到irb会话中或者在ruby的命令行上运行它,我们会在控制台中看到“in class”输出,即使我们没有做任何事情那个班。