我正在尝试使用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...:
答案 0 :(得分:2)
我无法找到任何已经存在的东西,所以我想出了很长的路要走。如果您没有多个返回多个值的函数,则可以执行类似
的操作(define-values (a b) (game-iter 10))
(check-equal? a 5)
(check-equal? b 10)
您可以为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)
(同样,选择比a
b
更好的名字。)
如果您想要更加通用,请查看call-with-values
。
答案 1 :(得分:1)
(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?
宏的第三个参数的支持,但是,我觉得这很有效。