Я написал программу для проекта, использующего Pipes, который мне очень нравится! Однако я изо всех сил пытаюсь провести модульное тестирование своего кода.
У меня есть ряд функций типа Pipe In Out IO ()
(например), которые я хочу протестировать с помощью HSpec. Как я могу это сделать?
Например, предположим, что у меня есть этот домен:
data Person = Person String Int | Unknown deriving (Show, Eq)
data Classification = Friend | Foe | Undecided deriving Show
и эта труба:
classify :: Pipe Person (Person, Classification) IO ()
classify = do
p@(Person name _) <- await
case name of
"Alex" -> yield (p, Friend)
"Bob" -> yield (p, Foe)
_ -> yield (p, Undecided)
Я хотел бы написать спецификацию:
main = hspec $ do
describe "readFileP" $
it "yields all the lines of a file"
pendingWith "How can I test this Pipe? :("
runEffect
для материализации значений. Очевидно, вы должны решить, как создавать и передавать тестовые данные в канал. - person user2407038   schedule 27.08.2016runEffect
просто даст мнеm r
, в данном случае этоIO ()
. Не знаете, как это должно помочь? - person Alex   schedule 27.08.2016runEffect classify
, аrunEffect (giveDataToClassify classify)
- как я уже сказал, ваш канал принимает входные данные, и вы должны решить, какой ввод, просто комбинируя свой канал соответствующим образом с каналом, который создает выходные данные, не требуя ввода ( Я думаю, что вpipes
этоProducer
). Например, делает лиtoListM $ mapM_ yield [ Person "Bob" 10, Person "June" 20 ] >-> classify
то, что вы хотите? Обратите внимание, что тип\xs -> toListM $ mapM_ yield xs >-> classify
— это[Person] -> IO [(Person, Classification)]
, который мне кажется формой, совместимой с HSpec. - person user2407038   schedule 28.08.2016runEffect
находится в монадеIO
, которая не может оценитьExpectation
, требуемую hspecit
. - person Alex   schedule 29.08.2016it
, принимает аргументExample a => a
, и у вас есть экземпляр дляExample Expectation
(т.е.Example (IO ())
), семантика которого генерация исключенияHUnitFailure
означает провал теста, а генерация исключенияResult
(кажется?) обозначает успех теста. Что (почти) соответствует всем требованиям. Мне кажется странным, что нет экземпляраExample a => Example (IO a)
или дажеExample (IO Result)
- кажется, они могут быть вам полезны. Может быть, вам стоит попробовать написать их самостоятельно? - person user2407038   schedule 29.08.2016