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