2012-07-26 6 views
10

मैं अपने पैरों को SpecFlow से गीला कर रहा हूं, और मैं वास्तव में इसका आनंद लेता हूं।SpecFlow - एकाधिक से पहले सेनेरियो विधियों का ऑर्डरिंग

कुछ कांटेदार मुद्दों के अलावा ... सुविधा और परिदृश्य सेटअप कोड की तरह।

एक में "सामान्य प्रयोजन" फ़ाइल InfrastructureSteps.cs कहा जाता है, मुझे लगता है कि हर परिदृश्य के लिए चलाने की जानी चाहिए सामान्य सेटअप कोड है - इसलिए मेरी विधि इस तरह दिखता है:

[BeforeScenario] 
public void SetupDbContext() 
{ 
    // define some basic stuff, set up a database transaction context etc. 
} 

यह से पहले चलाने के लिए की जरूरत है प्रत्येक परिदृश्य, और अब तक, यह ठीक काम करता है।

लेकिन अब, मैं एक परीक्षण-विशिष्ट चरण फ़ाइल में दो परिदृश्यों कि भी काफी व्यापक सेटअप की आवश्यकता को चलने से पहले किया जा सकता है। तो मैं एक टैग के साथ .feature में अपने परिदृश्य में चिह्नित:

@needs_extra_setup 
Scenario: ..... 
    Given ..... 
    When ..... 
    Then ...... 

और कार्यान्वित की एक परीक्षण विशेष BeforeScenario सेटअप विधि:

[BeforeScenario("needs_extra_setup")] 
public void DoExtraSetupForMyScenario() 
{ 
    // do stuff 
} 

यह काम करता है - यह कहा जाता हो जाता है - लेकिन यह से पहले कहा जाता हो जाता है सामान्य उद्देश्य [BeforeScenario] विधि को कॉल किया जाता है :-(और इस प्रकार यह विफल हो जाता है - उस सामान्य उद्देश्य सेटअप विधि में स्थापित होने वाली सामग्री मौजूद नहीं है और मेरा कोड विफल होने का कारण बनता है।

तो [BeforeScenario] विधियों को ऑर्डर करने के लिए SpecFlow में कोई तरीका है? या क्या मैं एक "बेस" [BeforeScenario] विधि को निष्पादित करने के लिए एक विशिष्ट [BeforeScenario] विधि बता सकता हूं जैसे अतिव्यापी विधि में आधार विधि को कॉल करना?

बेशक मुझे लगता है कि "आधार" [BeforeScenario] विधि स्पष्ट रूप से कह सकते हैं - लेकिन यह एक स्लेज-हथौड़ा दृष्टिकोण की तरह एक सा लगता है .....

कोई भी विचार? विचार? संकेत दिए गए?

उत्तर

7

मुझे पूरा यकीन है कि आप अपने परिदृश्यों के निष्पादन आदेश को आदेश दे सकते हैं (और शायद नहीं)।

लेकिन आप BeforeFeature के रूप में इस्तेमाल कर सकते हैं कुछ अन्य hooks इस तरह के और हो सकता है उसके चारों ओर पाने कि जिस तरह से।

एक और तरीका यह है कि केवल एक ध्वज है जो जांच करता है कि सामान्य सामान को विशिष्ट सामग्री में सेट किया गया है, जो SetupDbContext विधि में कॉल कर रहा है (या अधिमानतः सेटअप डीबी कॉन्टेक्स्ट कॉल बदले में)।

अपने झंडे को स्टोर करने के ScenarioContext.Current शब्दकोश का प्रयोग करें।

मुझे आशा है कि आपको यह उपयोगी

+0

आप पहले से फीचर – Heliac

4

मुझे एक ही समस्या थी। मैं

if(ScenarioContext.Current.ScenarioInfo.Tags.Contains("needs_extra_setup")) 

[पहलेसेनारियो] विधि के अंत में समाप्त हो गया। यह पहले से ही मार्कस से जुड़े पृष्ठ पर वर्णित है: SpecFlow Hooks

+0

के साथ उपयोग के लिए FeatureContext.Current का भी उपयोग कर सकते हैं इसके लिए धन्यवाद! वेब (यानी सेलेनियम) और गैर-वेब स्वीकृति परीक्षणों के बीच भेदभाव करने का एक तरीका ढूंढ रहा था, कि हुक दस्तावेज़ ने मुझे वही दिया जो मुझे चाहिए :) –

1

यह अब specflow के v2 में संभव है, जो लेखन के समय बीटा में है।

चरण बाध्यकारी विशेषताओं में एक वैकल्पिक ऑर्डर प्रॉपर्टी होती है जो आपको हुक के आदेश को निर्दिष्ट करने की अनुमति देती है। छोटी संख्या पहले संसाधित की जाएगी और डिफ़ॉल्ट आदेश मान 10,000 है।

+0

धन्यवाद! - '[ऑर्डर] ने इसे [अंतिम रिलीज] में बनाया है (http://www.specflow.org/documentation/Hooks/) – StuartLC

संबंधित मुद्दे