当我面对some issue时,我决定检查before
和after
钩子的执行顺序。这就是我所做的:
require "spec_helper"
describe "The order:" do
before(:all) {
puts "before_all"
}
after(:all) {
puts "after_all"
}
before(:each) {
puts "before_each"
}
after(:each) {
puts "after_each"
}
describe "DESC A" do
before {
puts "A_before"
}
it "A_it_1" do
expect(1).to eq(1)
end
it "A_it_2" do
expect(1).to eq(1)
end
end
describe "DESC B" do
before {
puts "B_before"
}
it "B_it_1" do
expect(1).to eq(1)
end
it "B_it_2" do
expect(1).to eq(1)
end
end
end
字符串
我得到了什么:
The order:
before_all
DESC A
before_each
A_before
after_each
A_it_1
before_each
A_before
after_each
A_it_2
DESC B
before_each
B_before
after_each
B_it_1
before_each
B_before
after_each
B_it_2
after_all
型
这是怎么回事?为什么after_each
在A_it_1
之前运行?
更新:
添加around(:each)
更有趣:
around(:each) do |example|
puts "around_in"
example.run
puts "around_out"
end
型
结果:
The order:
before_all
DESC A
around_in
before_each
A_before
after_each
around_out
A_it_1
around_in
before_each
A_before
after_each
around_out
A_it_2
DESC B
around_in
before_each
B_before
after_each
around_out
B_it_1
around_in
before_each
B_before
after_each
around_out
B_it_2
after_all
型
3条答案
按热度按时间zfciruhq1#
您的输出和www.example.com上记录的官方输出relishapp.com是正确的。实际上,rspec需要在每个示例之后运行after(:each),因为after(:each)中的异常会导致示例失败。在rspec可以在输出中显示示例之前,它需要知道它是绿色还是红色,这意味着在示例的描述出现在输出中之前,需要运行after(:eaches)。
然而,如果你在实际的例子中放入一个puts语句,你会看到before(:each)出现在它之前,然后运行例子代码(包括puts),然后是after(:each),就像你所期望的那样,最后,例子的描述被输出到屏幕上。
和你一样,我也很困惑,直到我意识到rspec打印出示例的标签与它实际做的事情不一致--只有为示例运行了所有before(:all)、before(:each)es和after(:each)es之后,标签才会被打印出来。
注意:after(:all)在示例标签被打印出来之后才运行,因为它们不会影响测试的结果(after(:all)钩子中发生异常时会生成一个警告,但这不会使测试变红)。
yvt65v4c2#
RSpec's documentation for
before
andafter
hooks指定它们运行的顺序。但是,RSpec's documentation foraround
hooks没有指定它们运行的顺序。本规范测试
around
、before
和after
、:all
和:each
以及示例的执行顺序。当我使用rspec(-core)2.14.8运行它时,它们按照您期望的顺序执行:字符串
注意一些可能令人惊讶的事情:
self
在:all
和:each
块中是不同的,所以我需要使用全局变量而不是示例变量。after :all
(但不是before :all
)会吃异常。.should
工作!你通常不会想在那里使用它。h7wcgrx33#
这一点上面已经回答过了,只是再补充一个简单的回答方式。
要查看钩子运行的顺序,还必须在“it”中添加“puts”语句
所以呢
字符串