Rackunit:深入检查异常类型

时间:2016-02-01 17:59:38

标签: unit-testing exception racket rackunit

在Rackunit中,我知道如何断言抛出异常:

#lang racket

(module+ test
  (require rackunit)
  (check-exn exn:fail:contract? (lambda () (3 + 4))))

但是,我找不到一种方法来断言更具体的东西。看at the exception hierarchy in Racketexn:fail:contract可能意味着许多事情:错误的arity,除以零......

我想在测试中断言这个特殊的异常是:

; application: not a procedure;
;  expected a procedure that can be applied to arguments

在其印刷信息中。你是如何做到这一点的?

1 个答案:

答案 0 :(得分:5)

谓词不一定是内置的异常谓词。您可以使用自己的,如下所示:

(check-exn (lambda (e)
             (and (exn:fail:contract? e)
                  (regexp-match #rx"not a procedure" (exn-message e))))
           (lambda () (3 + 4)))

Rackunit的check-exn也接受正则表达式代替异常谓词。在这种情况下,它会检查其消息与正则表达式匹配的exn:fail(或其任何子类型)。所以你也可以这样写:

(check-exn #rx"not a procedure" (lambda () (3 + 4)))