हुक के बाद और उसके आसपास, आरएसपीईसी के पहले क्रम में क्या आदेश होता है? - रूबी, आरएसपीसी

जैसा कि मैंने सामना किया था कुछ मुद्दा मैंने किस क्रम में जांच करने का फैसला किया 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

उत्तर:

उत्तर № 1 के लिए 6

Your output, and the official output documented relishapp.com पर, सही हैं। क्या हो रहा है कि rspec को प्रत्येक उदाहरण के बाद (: प्रत्येक) es को चलाने की आवश्यकता है, क्योंकि बाद में एक अपवाद (प्रत्येक) उदाहरण को असफल कर देगा। इससे पहले कि rspec आउटपुट में उदाहरण प्रदर्शित कर सके, इसकी आवश्यकता है यह जानने के लिए कि क्या यह हरा या लाल है, जिसका मतलब है कि आउटपुट में उदाहरण के विवरण प्रकट होने से पहले (eaches) को चलाने की आवश्यकता है।

हालांकि, अगर आप अपने में एक कथन कथन डालते हैंवास्तविक उदाहरण, आप देखेंगे कि पहले (: प्रत्येक) es इससे पहले होता है, फिर उदाहरण कोड चलाया जाता है (डालों सहित), फिर बाद (: प्रत्येक) es, जैसा कि आप उम्मीद करेंगे, और अंत में, विवरण उदाहरण के लिए स्क्रीन पर आउटपुट है।

आप की तरह, जब तक मुझे एहसास हुआ, मैं भी उलझन में थाउदाहरण के लेबल को प्रिंट करने के लिए आरएसपीईसी "यह वास्तव में क्या कर रहा है इसके साथ मेल नहीं खाता है - लेबल केवल पहले (सभी) एस, पहले (प्रत्येक) es, और बाद में (प्रत्येक के बाद मुद्रित हो जाता है) ) es उदाहरण के लिए चलाए जाते हैं।

नोट: के बाद (:सब कुछ उदाहरण लेबल लेबल के बाद चलाया जाता है, क्योंकि वे परीक्षण के नतीजे को प्रभावित नहीं करते हैं (एक चेतावनी उत्पन्न होती है कि एक अपवाद (: सभी) हुक में एक अपवाद हुआ, लेकिन यह एक परीक्षण लाल नहीं होता है )।


जवाब के लिए 4 № 2

आरएसपीसी के लिए प्रलेखन before तथा after हुक वह आदेश निर्दिष्ट करता है जिसमें वे दौड़ते हैं। हालाँकि, आरएसपीसी के लिए प्रलेखन 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

कुछ संभावित आश्चर्यजनक चीजों पर ध्यान दें:

  • self में अलग है :all तथा :each ब्लॉक, तो मुझे एक आवृत्ति चर के बजाय एक वैश्विक उपयोग करने की आवश्यकता है।
  • after :all (लेकिन नहीं before :all) अपवाद खाता है।
  • उन सभी जगहों को देखो .should काम करता है! ऐसा नहीं है कि आप आमतौर पर इसका उपयोग करना चाहते हैं।

संबंधित सवाल
सबसे लोकप्रिय