我想为我用SML编写的程序创建单元测试。
考虑一个功能
val foo = fn : int -> int seq
对于foo 5
,它将返回:val it = foo (5,fn) : int seq
。 (seq
是某种数据类型。
它的作用并不重要,我只想创建检查元组左侧项目的测试。
我尝试过:
val test = ((foo 5) = (seq (5,_)));
val test = ((foo 5) = (seq (5,fn)));
但是他们没有用。我可以编写一个单行测试来验证左元组是否包含5
吗?
答案 0 :(得分:1)
您可以使用模式匹配的let-binding;
val test = let val seq (x,_) = foo 5 in x = 5 end;
答案 1 :(得分:0)
您可能想测试访问此数据类型的抽象接口。如果使用'a seq
(我假设这是'a
的惰性流),则可以使用take
函数并对其进行测试。例如,
datatype 'a seq = Cons of 'a * (unit -> 'a seq)
fun from n = Cons (n, fn () => from (n+1))
fun take 0 _ = []
| take n (Cons (x, f)) = x :: take (n-1) (f ())
对take
的测试可能像这样:
val nats = from 0
val test_take_1 = take 0 nats = []
val test_take_2 = take 1 nats = [0]
val test_take_3 = take 3 nats = [0,1,2]
val test_take_4 = ( take ~1 nats ; false )
handle Out_of_memory => true
| _ => false
在这里,我正在测试take
为负时,n
是否按预期失败。
如果它没有失败,或者除了Out_of_memory
之外还有其他异常失败,则测试失败。
所以:
定义您的数据类型,
定义访问它的抽象接口,
测试该抽象接口。