具有多个输出的Racket中的单元测试

时间:2016-12-10 23:26:31

标签: unit-testing lisp racket

我正在尝试使用Racket进行单元测试。

通常,我很成功,我真的很喜欢rackunit。但是,我遇到了这个具体案例的问题。

要测试的功能输出两个值。如何使用rackunit进行测试?

我打电话的时候:

(game-iter 10)
>>  5 10

我尝试使用此测试:

(check-equal? (game-iter 10) 5 10)

然而,它失败了:

. . result arity mismatch;
 expected number of values not received
  expected: 1
  received: 2
  values...:

2 个答案:

答案 0 :(得分:2)

我无法找到任何已经存在的东西,所以我想出了很长的路要走。如果您没有多个返回多个值的函数,则可以执行类似

的操作
(define-values (a b) (game-iter 10))
(check-equal? a 5)
(check-equal? b 10)

您可以为ab选择更好的名称。

您可以使用以下内容对此进行抽象:

;; check if (game-iter n) produces (values a-expect b-expect)
(define-simple-check (check-game-iter n a-expect b-expect)
  (define-values (a b) (game-iter n))
  (and (equal? a a-expect)
       (equal? b b-expect)))
(check-game-iter 10 5 10)

(同样,选择比a b更好的名字。)

如果您想要更加通用,请查看call-with-values

答案 1 :(得分:1)

一种简单的宏观方法

@ Gibstick的回答是正确的,但我想说明一个更为一般的方法,#racket irc频道上的某个人在几个月前给了我:

(define-syntax check-values-equal?
  (syntax-rules ()
    [(_ a b) (check-equal? (call-with-values (thunk a) list)
                           b)]))

您可以这样使用它:

(check-values-equal? (game-iter 10) '(5 10))

还有一些改进的余地(例如添加对check-equal?宏的第三个参数的支持,但是,我觉得这很有效。