2014-04-05 4 views
6

프로그램을 테스트하고 있습니다. 특히, 나는 함수를 독립적으로 테스트하고있다. 그것은 읽고 쓸 수있는 핸들이 필요합니다. 문제는 stdin 또는 stdout만으로는 작업을 수행 할 수 없다는 것입니다. 그런 테스트 때문에 코드를 다시 작성하고 싶지 않고 테스트를 위해서 소켓을 열 필요도 없습니다. 또한 프로그램은 아직 사용할 수 없기 때문에 (함수가 정의되지 않았 음) 실행하여 테스트 할 수는 없습니다.`stdin`과`stdout` 핸들

입력란에 stdin을 입력하고 haskell에서 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를 실행할지 여부를 선택할 수 있습니다.