2014-04-05 12 views
6

मैं एक प्रोग्राम का परीक्षण कर रहा हूं। विशेष रूप से, मैं अलगाव में एक समारोह का परीक्षण कर रहा हूँ। इसके लिए एक हैंडल की आवश्यकता होती है जिसे दोनों पढ़ और लिख सकते हैं। समस्या यह है कि, stdin या stdout अकेले नौकरी नहीं कर सकता है। मैं सिर्फ इस तरह के परीक्षण के कारण अपने कोड को फिर से लिखना नहीं चाहता हूं, न ही मैं सिर्फ एक परीक्षण के लिए सॉकेट खोलना चाहता हूं। साथ ही, कार्यक्रम अभी तक उपयोग करने योग्य नहीं है (क्या फ़ंक्शन अपरिभाषित हैं) इसलिए मैं इसे चलाकर इसका परीक्षण नहीं कर सकता।`stdin` और` stdout` हैंडल

एक हैंडल क्या है जो इसे stdin से इनपुट प्राप्त करता है और हैकेल में stdout से आउटपुट प्राप्त करता है।

+0

क्या आपके कोड को दो हैंडल लेने, इनपुट के लिए एक और आउटपुट के लिए बदलने के लिए अनुचित है? –

+0

ठीक है, यह मुझे लगता है कि यह बाहर साफ होगा। मुझे लगता है कि मैं हालांकि ऐसा कर सकता था। – PyRulez

+1

मुझे बस हैंडल पास करना है (stdin/out/err के लिए) और उन्हें ['Data.Knob'] पर इंगित करें (https://hackage.haskell.org/package/knob-0.1.1/docs/Data- Knob.html) उदाहरण अगर मुझे "शुद्ध" परीक्षण की आवश्यकता है। –

उत्तर

17

ऐसा करने का एक आसान तरीका Pipe का उपयोग करने के लिए हैंडल को पढ़ने और लिखने के लिए है। एक प्रकार का उपयोग कर सकते है:

original :: IO() 
original = do 
    str1 <- getLine 
    str2 <- getLine 
    putStrLn (str1 ++ str2) 

नई pipes संस्करण इस प्रकार दिखाई देगा:

import Pipes 

example :: Monad m => Pipe String String m() 
example = do 
    str1 <- await 
    str2 <- await 
    yield (str1 ++ str2) 

example :: Monad m => Pipe String String m() 

उदाहरण के लिए, मान लें कि आपका मूल कोड कुछ इस तरह लग रही थीं

फिर, आप इसे पूरी तरह से परीक्षण कर सकते हैं:

>>> import qualified Pipes.Prelude as Pipes 
>>> Pipes.toList (each ["Hello, ", "world!"] >-> example) 
["Hello, world!"] 
,210

... या आप वास्तविक इनपुट और आउटपुट के साथ यह परीक्षण कर सकते हैं:

>>> runEffect $ Pipes.stdinLn >-> example >-> Pipes.stdoutLn 
Hello, <Enter> 
world!<Enter> 
Hello, world! 

यह आप अपने मुख्य तर्क को शुद्ध रखने, और फिर चाहे या नहीं यह विशुद्ध रूप से या impurely चलाने के लिए चुन सकते हैं।

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