我试着用球拍进行单元测试。
通常情况下,我是成功的,我真的很喜欢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...:发布于 2016-12-10 23:56:48
我找不到任何已经存在的东西,所以我想出了一条很长的路。如果没有许多返回多个值的函数,则可以执行以下操作
(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。
发布于 2016-12-25 10:54:44
一种简单的宏方法
@吉布斯蒂尔的回答是正确的,但我想说明的是,几个月前#球拍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?宏的第三个参数的支持),但是,我发现这已经足够好了。
https://stackoverflow.com/questions/41081395
复制相似问题