2013-07-31 7 views
7

पर ककड़ी चरण या चरण फ़ाइल सीमित करें मैंने अपने वेब ऐप के लिए एक मोडल स्लाइड शो लिखा है जो दस्तावेज़ों के सेट के लिए नेविगेशन प्रस्तुत करता है और उन दस्तावेज़ों के लिए विभिन्न मेटाडेटा का खुलासा करता है।निर्दिष्ट सुविधा या टैग

यह गूढ़ आवश्यकताओं के साथ आवेदन का एक बड़ा घटक है, इसलिए मुझे लगता है कि यह काफी उचित है कि इसके मूल परिदृश्य (मुझे स्वीकृति मानदंड के रूप में दिया गया) दोनों आंतरिक रूप से लगातार होना चाहिए।

हमारे कई में से प्रत्येक स्थिति के लिए एक नया कदम होने से बचने के लिए, मैं a helper जो मानव पठनीय शर्तों तब्दील अनुकूल नहीं बनाया है चयनकर्ताओं में इस तरह के रूप document caption:

module SelectorsHelper 
    def selector_for(term) 
    case term 
    # Lightbox/modal/fancybox 
    when 'lightbox' 
     '#fancybox-inner' 
    when 'close button' 
     '.document-viewer__tools__close' 

... जैसे कुछ सामान्य कदम परिभाषाओं के साथ निम्नलिखित:

# Generic click action 
When(/^I click (?:on)?(?:the |a)'(.*?)'?$/) do |element| 
    find(selector_for(element)).click 
end 

समस्या है, चाहे मैं ऊपर या अधिक विशिष्ट पैटर्न है कि सुविधाओं का एक सेट के भीतर पुनरावृत्ति होना, को शामिल कपोल-कल्पना के साथ के रूप में बहुत सामान्य विचार पर अभिनय कर रहा हूँ कि इन डब्ल्यू कहर बरपाने ​​सकता है अन्य गूढ़ विशेषताओं के साथ, जो उन्हें पार्स करने के लिए अधिक विशिष्ट कदम हो सकते हैं। मैंने देखा है कि प्रत्येक ककड़ी उदाहरण में चरण परिभाषा फाइलें हैं जिनके फ़ाइल नाम एक विशिष्ट फीचर फ़ाइल के लिए एक प्रक्रियात्मक संबंध रखता है, और मेरी धारणा यह थी कि इन मामलों में, उस चरण परिभाषा फ़ाइल को केवल इसकी संबंधित विशेषता में परिदृश्यों को पार्स करने के लिए बुलाया जाएगा:

+ features 
| + step_definitions 
| | + global_steps.rb 
| | + modal_steps.rb 
| | + login_steps.rb 
| + modal.feature 
| + login.feature 

लेकिन ऐसा नहीं है - और मैं अपने आप को इस धारणा है कि ककड़ी हर परिदृश्य को हर कदम परिभाषा पैटर्न लागू करने के लिए प्रयास करता है करने के लिए इस्तीफा देने के लिए संघर्ष कर रहा हूँ। यदि इन परीक्षणों में कोई योग्यता होगी, तो वे अधिक असंख्य हो जाएंगे, नई अवधारणाओं को पेश करेंगे, और लगातार पुनः लिखने के बिना प्रासंगिक रहेंगे। मैं उन चरणों के साथ हस्तक्षेप रोकने के लिए अपने कदमों के दायरे को सीमित करने में सक्षम होना चाहता हूं, जिन्हें वे नहीं लिखे गए थे, लेकिन यह नहीं जानते कि कैसे। निम्नलिखित वैचारिक समाधान दिमाग में आते हैं: लपेटकर किसी तरह का में

  • पृष्ठभूमि का उपयोग करें या परिदृश्य @tags और
  • घोंसला कदम परिभाषाओं उन टैग के साथ ही परिदृश्यों के लिए चरणों का आह्वान सहायक या परा कदम परिभाषा है कि एक द्वारा लाया है

मैं रूबी और ककड़ी से अपरिचित हूं, बहुत पतली लगती है, इसलिए मैं एक तरफ असीमित क्षमता से परेशान हूं और दूसरे पर पूर्व निर्धारित कार्यान्वयन नहीं कर रहा हूं। कोई विचार?

उत्तर

4

मेरे अनुभव में अत्यधिक सामान्य कदम स्वचालन कोड आधार को बनाए रखने में बेहद मुश्किल हो जाते हैं। यदि संभव हो तो यहां शेष राशि के लिए जाने का प्रयास करें, केवल आप ही यह तय कर सकते हैं कि यह शेष राशि कहां है। आप अत्यधिक बार-बार चरणबद्ध परिभाषा नहीं चाहते हैं, लेकिन आप डीबग करने के लिए एक सुपर जेनेरिक दुःस्वप्न नहीं चाहते हैं।

टैग की सूची में जाने के लिए एक कामकाज का उपयोग करना संभव है लेकिन कृपया ऐसा न करें। यह सकल, अजीब है और कैसे ककड़ी का उपयोग करने का इरादा नहीं है।

एक समाधान अपने step_definitions में आप एक चारों ओर कदम का उपयोग कर सकते परिदृश्य से टैग नामों की सूची प्राप्त करने के लिए के रूप में -

Around do |scenario, block| 
    begin 
    @tag_names = scenario.tags.collect { |tag| tag.name } 
    block.call 
    ensure 
    $tags = nil 
    end 
end 

फिर step_definition शरीर की जांच में यदि आप पता लगाने के लिए चाहते हैं टैग में शामिल किया गया है सूची -

Given(/^I am testing a step with a "([^"]*)"$/) do |arg| 
    if @tag_names.include?('@a_tag') 
    puts 'Executing a step definition with tag - @a_tag' 
    else 
    puts 'Executing a step definition without tag - @a_tag' 
    end 
end 

यह सुविधा -

टी में
Feature: Example feature 

    @a_tag 
    Scenario: Example scenario #1 
    Given I am testing a step with a "value" 

    Scenario: Example scenario #1 
    Given I am testing a step with a "value" 

परिणाम उसका आउटपुट -

Feature: Example feature 

    @a_tag 
    Scenario: Example scenario #1    # features/example.feature:4 
    Given I am testing a step with a "value" # features/step_definitions/step_definitions.rb:10 
     Executing a step definition with tag - @a_tag 

    Scenario: Example scenario #1    # features/example.feature:7 
    Given I am testing a step with a "value" # features/step_definitions/step_definitions.rb:10 
     Executing a step definition without tag - @a_tag 

2 scenarios (2 passed) 
2 steps (2 passed) 
0m0.004s 

फिर मुझे लगता है कि इसका उपयोग करना एक अविश्वसनीय रूप से बुरा विचार है। थोड़ा सा दोहराव वाली चरण परिभाषाएं बेहतर होती हैं जो कि उन सभी पर शासन करने के लिए एक सुपर जेनेरिक चरण परिभाषा के बाद पालन करने और डीबग करने में आसान होती हैं!

संपादित करें - अपना प्रश्न और ब्लॉग पोस्ट दोबारा पढ़ने के बाद मुझे नहीं लगता कि यह वास्तव में आपके प्रश्न का उत्तर देता है। हालांकि, मैं काफी हद तक निश्चित हूं कि आप कुछ गैर-ककड़ी

+0

ऐसा करने का प्रयास कर रहे हैं, मुझे लगता है कि मेरा प्रश्न अविश्वसनीय रूप से सामान्य परिस्थिति के लिए अत्यधिक विशिष्ट समाधान की तलाश में था। यह एक अच्छा सवाल है जिसे मैं उम्मीद कर सकता था। आपकी सलाह - क्या नहीं ककड़ी का उपयोग किया जाना चाहिए_ - बहुत समझ में आता है। अगर मैं कभी ककड़ी का उपयोग करने के लिए लौट आया तो मैं उस सलाह का पालन करूंगा! – Barney

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