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

5 lisp unit-testing racket

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

通常,我很成功,而且我真的很喜欢机架单元。但是,我在处理这个具体案例时遇到了麻烦。

要测试的函数输出两个值。我如何使用机架单元进行测试?

当我打电话时:

(game-iter 10)
>>  5 10
Run Code Online (Sandbox Code Playgroud)

我尝试使用这个测试:

(check-equal? (game-iter 10) 5 10)
Run Code Online (Sandbox Code Playgroud)

但是,它失败了:

. . result arity mismatch;
 expected number of values not received
  expected: 1
  received: 2
  values...:
Run Code Online (Sandbox Code Playgroud)

Gib*_*ick 2

我找不到任何已经存在的东西,所以我想出了很长的路要走。如果你没有很多返回多个值的函数,你可以这样做

(define-values (a b) (game-iter 10))
(check-equal? a 5)
(check-equal? b 10)
Run Code Online (Sandbox Code Playgroud)

a您可以为和选取更好的名称b

你可以用类似这样的东西来抽象一下:

;; 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)
Run Code Online (Sandbox Code Playgroud)

(再次,选择比 更好的名字a b。)

如果您想让它更加通用,请看一下call-with-values