как протестировать импорт Control.Monad.Except с помощью Hunit?

Как я могу проверить Control.Monad.Except (оба результата защиты) такую ​​функцию, как:

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

используя hunit?


person Randomize    schedule 14.01.2017    source источник
comment
Судя по тому, что я видел до сих пор, невозможно использовать hunit с монадой, отличной от IO.   -  person Eli Sadoff    schedule 15.01.2017
comment
альтернатива хуниту?   -  person Randomize    schedule 15.01.2017
comment
Я не уверен. Есть ли причина, по которой вы используете Except? Я бы использовал Maybe вместо этого здесь.   -  person Eli Sadoff    schedule 15.01.2017
comment
У меня более сложный случай, это самый короткий пример   -  person Randomize    schedule 15.01.2017


Ответы (1)


Довольно просто написать некоторые функции, использующие 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
    ]
person Benjamin Hodgson♦    schedule 14.01.2017
comment
спасибо, я уже пытался использовать runExcept, но у меня возникали ошибки, и я не был уверен, что поступаю правильно. - person Randomize; 15.01.2017