使用check-random键入的球拍错误

时间:2017-03-28 14:43:38

标签: unit-testing scheme racket

我正在尝试将项目从racket转换为类型球拍,因为测试引擎,我遇到了使用代码的错误。

我已经将它缩减为我可以创建的最小的代码片段来重现问题:

#lang typed/racket

; provides check-expect and others for testing
(require typed/test-engine/racket-tests)

(: bar (-> Positive-Integer Integer))

(check-random (bar 6) (random 6))

(define (bar x)
  (random x))

(test)

错误是:

. Type Checker: type mismatch
  expected: Pseudo-Random-Generator
  given: Any in: (check-random (bar 6) (random 6))

. Type Checker: type mismatch
  expected: Positive-Integer
  given: Any in: (check-random (bar 6) (random 6))

. Type Checker: Summary: 3 errors encountered in:
  (check-random (bar 6) (random 6))
  (check-random (bar 6) (random 6))
  (check-random (bar 6) (random 6))

有没有人对如何解决此问题有任何建议?我真的希望能够尽可能使用类型检查功能。

由于

1 个答案:

答案 0 :(得分:2)

当然,我可以提供帮助,但这很大程度上取决于你想要什么,以及你要去哪里。

简短概述:Racket有多个测试框架。您正在使用为教学语言构建的那个。它有几个不错的功能,但一般来说rackunit是其他人使用的测试框架。

在我看来,教学语言测试框架的打字版本不包括对随机检查的支持。我会在邮件列表上查看这个。这会引导你走向rackunit。

不幸的是,rackunit不包括“check-random”表单。幸运的是,实施起来并不难。这是我的实现,附在你的代码上。

#lang typed/racket

; provides check-expect and others for testing
(require typed/rackunit)

;; create a new prng, set the seed to the given number, run the thunk.
(: run-with-seed (All (T) ((-> T) Positive-Integer -> T)))
(define (run-with-seed thunk seed)
  (parameterize ([current-pseudo-random-generator
                  (make-pseudo-random-generator)])
    (random-seed seed)
    (thunk)))

;; run a check-equal where both sides get the same PRNG seed
(define-syntax check-random-equal?
  (syntax-rules ()
    [(_ a b) (let ([seed (add1 (random (sub1 (expt 2 31))))])
               (check-equal? (run-with-seed (λ () a) seed)
                             (run-with-seed (λ () b) seed)))]))

(: bar (-> Positive-Integer Integer))
(define (bar x)
  (random x))

(check-random-equal? (bar 6)
                     (random 6))            

我应该告诉你两个测试框架之间的几个重要区别。

  • 你最后不需要打电话给“(测试)”;测试与其余代码交错运行。
  • 由于测试与代码交错,因此它们必须出现在运行测试所需的所有定义之下。
  • 测试成功时不会打印任何内容。