我正在实现执行此处运行时检查的“智能”构造函数 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次的乏味更好。