Как выполнить модульное тестирование умного конструктора, который выдает, когда конструирование невозможно? - PullRequest
0 голосов
/ 28 сентября 2018

Я реализую «умный» конструктор, выполняющий проверку во время выполнения, как описано здесь 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 раз.

...