【问题标题】:PLT Racket test cases for multiple values多个值的 PLT Racket 测试用例
【发布时间】:2010-09-20 02:18:29
【问题描述】:

我似乎无法测试我使用 test-engine/racket-tests 包在 PLT Racket 中编写的函数。

代码如下。它返回多个值(不知道为什么不称它们为元组)。

(define (euclid-ext a b)
  (cond
    [(= b 0) (values a 1 0)]
    [else (let-values ([(d x y) (euclid-ext b (modulo a b))])
            (values d y (- x (* (quotient a b) y))))]
    ))

问题是使用以下格式对其进行测试。以下是我尝试过的一些。

(check-expect (values (euclid-ext 99 78)) (values 3 -11 14))
(check-expect (euclid-ext 99 78) (values 3 -11 14))
(check-expect (list (euclid-ext 99 78)) (list 3 -11 14))

现在,这会产生错误context expected 1 value, received 3 values: 3 -11 14。无论我如何尝试(使用列表、值、无值等),我都无法成功评估此测试用例。

【问题讨论】:

    标签: unit-testing scheme


    【解决方案1】:

    test-engine 库用于学生代码,因此它不处理多个值(大多数课程不处理)。 Rackunit 库之类的东西更适合这种情况。

    【讨论】:

    • 感谢您的推荐。下次我会使用那个库。
    【解决方案2】:

    看起来测试框架不接受值。我认为您会发现使用列表作为返回值会更轻松。

    但是,如果您真的想这样做,您可以使用 call-with-valuesvalues 转换为列表,如下所示:

    (call-with-values (lambda () (values 1 2 3)) list)
    

    所以测试应该是这样的:

    (check-expect (call-with-values (lambda () (euclid-ext 99 78)) list)
                  (list 3 -11 14))
    

    【讨论】:

    • 感谢您的建议,我将尝试使用列表。我这样做是因为返回一个元组很方便。你能用列表做类似的事情吗?但无论如何,谢谢你的解决方案。 :)
    • 我不确定这是否是您所问问题的答案,但您可以使用类似于 (define (example) (list 3 -11 14)) 的内容返回三个值的列表。因此,您可以返回(list d y ...),而不是返回(values d y (- x (* (quotient a b) y)))
    猜你喜欢
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    • 2017-02-21
    • 2015-10-25
    • 1970-01-01
    • 1970-01-01
    • 2023-01-27
    • 1970-01-01
    相关资源
    最近更新 更多