【问题标题】:Creating tests of datatypes in SML在 SML 中创建数据类型测试
【发布时间】:2019-01-04 21:47:56
【问题描述】:

我想为我用 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

【问题讨论】:

  • 错误是什么?您能否提供一个可重现的最小代码示例,我们可以用它来找出问题所在?

标签: sml


【解决方案1】:

您可以使用模式匹配的 let-binding;

val test = let val seq (x,_) = foo 5 in x = 5 end;

【讨论】:

    【解决方案2】:

    您可能想要测试访问此数据类型的抽象接口。对于'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
    

    我在这里测试taken 为负数时按预期失败。

    如果它没有失败,或者失败并出现Out_of_memory 以外的其他异常,则测试失败。


    所以:

    1. 定义您的数据类型,

    2. 定义访问它的抽象接口,

    3. 测试那个抽象接口。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多