2017-01-14 77 views
0

如何測試Control.Monad.Except(兩個後衛結果)像一個函數:如何測試導入Control.Monad.Except與Hunit?

foo :: Double -> Double -> Except String Double 
foo x y 
    | x < -10.0 = throwError "Invalid parameter" 
    | otherwise = pure $ x + y 

使用hunit

+0

好像從我迄今所看到的,不可能用非IO Monad的使用hunit。 –

+0

hunit的替代品? – Randomize

+0

我不確定。你有使用Except的原因嗎?我會在這裏使用'Maybe'。 –

回答

2

寫一些使用runExcept來執行Except動作並使用~?=來檢查其結果的函數非常簡單。

shouldThrow :: Eq e => Except e a -> e -> Test 
m `shouldThrow` e = runExcept m ~?= Left e 

shouldReturn :: Eq a => Except e a -> a -> Test 
m `shouldReturn` x = runExcept m ~?= Right x 

用法示例:

testFoo = TestList [ 
    foo -11 2 `shouldThrow` "Invalid parameter", 
    foo 3 1 `shouldReturn` 4 
    ] 
+0

謝謝,我已經試圖使用'runExcept',但我收到了一些錯誤,我不確定是否是正確的做法。 – Randomize