2011-01-03 10 views
6

मैं कुछ स्क्रिप्ट का परीक्षण कर रहा हूं जो सिस्टम कमांड के साथ इंटरफेस करते हैं। उनका तर्क सिस्टम कमांड के रिटर्न कोड पर निर्भर करता है, यानी $? का मूल्य? तो, एक सरल उदाहरण के रूप में, स्क्रिप्ट कह सकते हैं:

def foo(command) 
    output=`#{command}` 
    if $?==0 
    'succeeded' 
    else 
    'failed' 
    end 
end 

आदेश में इन तरीकों को ठीक से परीक्षण करने के लिए सक्षम होने के लिए, मैं कर्नेल backquote कॉल बाहर ठूंठ करने में सक्षम होना चाहते हैं, और $ सेट? एक मनमाना मूल्य के लिए, यह देखने के लिए कि क्या मुझे बैकक्वॉट कॉल के बाद विधि में तर्क से उचित व्यवहार मिलता है। $? केवल पढ़ने योग्य चर है, इसलिए निम्नलिखित काम नहीं करते हैं:

$? = some_number 

मैं कुछ साधारण सामान कर सकता हूं: उदाहरण के लिए, $ सेट करें? शून्य या शून्य के लिए। उदाहरण के लिए, $ सेट करेगा? या तो 0 या 35212 (अपने सिस्टम पर, वैसे भी) के लिए, $ ?:

def fail_or_succeed(success) 
    if success 
    `echo foo` 
    else 
    `a-non-existent-command 2>&1` 
    end 
end 

के मूल्य के आधार क्या मैं सच में ऐसा करने में सक्षम होना चाहते हैं $ स्थापित करने के लिए है? एक विशिष्ट मान (उदा। 3, या 122), न केवल शून्य या मनमाने ढंग से गैर-शून्य। मैं ऐसा करने का कोई तरीका नहीं समझ सकता। (मामले में यह मायने रखती है में, मैं टेस्ट :: यूनिट और मोचा का उपयोग कर परीक्षण कर रहा हूँ।)

उत्तर

10

संपादित करें: डेनिस विलियमसन के सुझाव का उपयोग करना:

command = "(exit 21)" 

और if $? == 0

+0

आह! धन्यवाद, यह काम करता है। मैंने आपके विचार की कोशिश की थी, लेकिन .exitstatus भाग को याद किया था। मैं .to_i (प्रभाव में) का उपयोग कर रहा था, जो रिटर्न (आपके उदाहरण में) 5376, 21 नहीं। – rleber

+0

@rleber: यह 'command = '(exit 21)' के रूप में सरल हो सकता है '(आप" बैश - सी "अगर आप इसे कोष्ठक में लपेटते हैं)। –

+0

@ डेनिस, नाइस - यह आसान और अधिक भरोसेमंद है (जब बैश '$ पाथ 'में नहीं है)। –

1
module Stubbed 
    def `(*args) 
    super("mycommand that returns the error code I want") 
    end 
end 
के बजाय if $?.exitstatus == 0 का उपयोग

आवश्यकता होने पर इसे अपने ऑब्जेक्ट में शामिल करें?

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

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