当我遇到一些问题时,我决定检查执行的顺序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
Run Code Online (Sandbox Code Playgroud)
我得到了什么:
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
Run Code Online (Sandbox Code Playgroud)
这里发生了什么 ??为什么after_each要跑A_it_1?
更新:
添加around(:each)更有趣:
around(:each) do |example|
puts "around_in"
example.run
puts "around_out"
end
Run Code Online (Sandbox Code Playgroud)
和结果:
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
Run Code Online (Sandbox Code Playgroud)
RSpec 的关于before和after钩子的文档指定了它们运行的顺序。但是,RSpec 的around钩子文档没有指定它们运行的顺序。
该规范试验中,顺序around,before和after :all和:each,和实例,执行。当我使用 rspec(-core) 2.14.8 运行它时,它们会按照您期望的顺序执行:
describe "order in which rspec around/before/after hooks run" do
before :all do
defined?($previous_hook).should be_false # this hook runs first
$previous_hook = "before :all"
end
around :each do |example|
$previous_hook.should == "before :all"
$previous_hook = "around :each 1"
example.run
$previous_hook.should == "after :each"
$previous_hook = "around :each 2"
end
before :each do
$previous_hook.should == "around :each 1"
$previous_hook = "before :each"
end
it "should not raise an exception or print anything" do
$previous_hook.should == "before :each"
$previous_hook = "example"
end
after :each do
$previous_hook.should == "example"
$previous_hook = "after :each"
end
after :all do
# rspec ignores assertion failures and any other exceptions raised here, so all we can do is puts.
# $previous_hook is a global because if it's an instance variable it is "before :all" at this point.
warn "Previous hook was #{$previous_hook}, NOT around :each 2 as expected" unless $previous_hook == "around :each 2"
end
end
Run Code Online (Sandbox Code Playgroud)
注意一些可能令人惊讶的事情:
self:all和:each块不同,所以我需要使用全局变量而不是实例变量。after :all(但不是before :all)吃异常。.should有效!并不是说您通常想在那里使用它。小智 6
您的输出和relishapp.com上记录的官方输出是正确的.发生的事情是rspec需要在每个示例之后运行after(:each)es,因为after(:each)中的异常会导致示例失败.在rspec可以在输出中显示示例之前,它需要知道它是绿色还是红色,这意味着需要在示例的描述出现在输出之前运行after(:eaches).
但是,如果在实际示例中放置puts语句,您将看到before(:each)es出现在它之前,然后运行示例代码(包括puts),然后是after(:each)es,只是正如您所期望的那样,最后,示例的描述输出到屏幕.
和你一样,我也很困惑,直到我意识到rspec打印出的例子的标签与它实际做的不一致 - 标签只在所有之前(:all)s,之前(:每个)打印出来es,以及在(:each)之后运行示例.
注意:在打印完示例标签之后运行(:all)之后运行,因为它们不会影响测试结果(生成警告,表示在after(:all)挂钩中发生异常,但这不是让测试变红).
| 归档时间: |
|
| 查看次数: |
3702 次 |
| 最近记录: |