Я реализую «умный» конструктор, выполняющий проверку во время выполнения, как описано здесь https://wiki.haskell.org/Smart_constructors#Smart.28er.29_constructors
Мой первый вопрос: как выполнить модульное тестирование, которое выдает неверный аргумент?
Вот что я пробовал
import Control.Exception
import Test.HUnit
metalResistor :: Bands -> Resistor
metalResistor n = Control.Exception.assert (n >= 4 && n <= 8) $ Metal n
m0 = metalResistor 0
test1 = TestCase ( assertBool (show mo) False)
tests = TestList [TestLabel "test1" test1]
Результаты:
*Main> runTestTT tests
### Error in: 0:test1
Assertion failed
CallStack (from HasCallStack):
assert, called at test.hs:42:19 in main:Main
Cases: 1 Tried: 1 Errors: 1 Failures: 0
Counts {cases = 1, tried = 1, errors = 1, failures = 0}
Я ожидаю, что поймать исключение в модульном тесте (assertThrow?) И чтотест пройден успешно.
Мой второй вопрос, возможно, имеет большую базу мнений, но я не уверен, какой подход выбрать для умного конструктора: тот, с ошибкой или тот, с Conntrol.Exception.assert
Вв конечном счете, я чувствую себя лучше, используя решение для ошибок;для ясности и для сопровождения кода и отслеживания ошибок, плюс, что утомительно писать один раз, лучше утомительно читать 1000 раз.