gpt4 book ai didi

unit-testing - 异常的 Racket 测试

转载 作者:行者123 更新时间:2023-12-05 00:54:36 25 4
gpt4 key购买 nike

我正在 Racket 中进行异常处理的第一步,并想编写一个单元测试,以检查过程是否为特定输入引发异常。

以下是我已经拥有的:

应引发异常的程序:

(define (div-interval x y)
;; EXERCISE 2.10
; exception handling
(with-handlers
([exn:fail:contract:divide-by-zero?
(lambda (exn)
(displayln (exn-message exn))
#f)])

(if (or
(>= (upper-bound y) 0)
(<= (lower-bound y) 0))

(raise
(make-exn:fail:contract:divide-by-zero
"possible division by zero, interval spans zero"
(current-continuation-marks)))

(mul-interval
x
(make-interval
(/ 1.0 (upper-bound y))
(/ 1.0 (lower-bound y)))))))

单元测试:
(require rackunit)

(define exercise-test
(test-suite
"exercise test suite"

#:before (lambda () (begin (display "before")(newline)))
#:after (lambda () (begin (display "after")(newline)))

(test-case
"checking interval including zero"
(check-exn
exn:fail:contract:divide-by-zero?
(div-interval
(make-interval 1.0 2.0)
(make-interval -3.0 2.0))
"Exception: interval spans zero, possible division by zero")))

(run-test exercise-test)

此测试套件中还有一些测试,但它们是针对其他过程的,因此我没有将它们包含在此代码中。当我运行我的程序时,我得到以下输出:
before
possible division by zero, interval spans zero
after
'(#<test-success> #<test-success> #<test-success> #<test-success> #<test-error>)

<test-error>用于本文中的测试用例。

该过程似乎没有引发异常。

这是因为我有一个 handler在我的程序中,它返回 #f因此已经“吃掉”了异常(exception)?

我通常如何为引发的异常编写单元测试?

最佳答案

你是绝对正确的,你的代码没有引发异常,因为 with-handler捕获并返回 #f .如果您想要 with-handler要为您重新提出异常(exception),您需要使用 raise ,使您的代码看起来像:

(define (div-interval x y)
(with-handlers
([exn:fail:contract:divide-by-zeor?
(lambda (e)
<do-stuff>
(raise e))])
<function-body>)

现在您的处理程序仍将运行,但最后它会为您重新引发异常。

至于测试它,你是绝对正确的 check-exn是正确的方法。除了因为 check-exn是一个过程,您需要将代码包装在一个 thunk 中,使其看起来像:
(require rackunit)
(check-exn
exn:fail:contract:divide-by-zero?
(lambda ()
(div-interval
(make-interval 1.0 2.0)
(make-interval -3.0 2.0))))

关于unit-testing - 异常的 Racket 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39792478/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com