给出以下代码:
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
意味着context
或describe
在我设置的任何配置之前运行。
当我绝对需要在测试文件中的其他任何内容之前运行代码时,我该怎么办?包括(嵌套)上下文还是描述?为什么它不像我期望的那样工作?
注意:当我将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
块之前继续运行测试,并且失败。
答案 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”输出,即使我们没有做任何事情那个班。