首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异常球拍测试

异常球拍测试
EN

Stack Overflow用户
提问于 2016-09-30 13:16:41
回答 1查看 929关注 0票数 5

我采取了我的第一步异常处理在球拍,并想写一个单元测试,检查,如果一个过程引发一个特定的输入异常。

以下是我已经拥有的:

应提出例外情况的程序:

代码语言:javascript
复制
(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)))))))

单元测试:

代码语言:javascript
复制
(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)

这个测试套件中还有更多的测试,但是它们是针对其他过程的,所以我没有将它们包含在这段代码中。当我运行我的程序时,我得到以下输出:

代码语言:javascript
复制
before
possible division by zero, interval spans zero
after
'(#<test-success> #<test-success> #<test-success> #<test-success> #<test-error>)

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

这一程序似乎并没有引起例外。

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-30 14:05:02

您完全正确,代码没有引发异常,因为with-handler捕获了它并返回了#f。如果希望with-handler为您重新引发异常,则需要使用raise,使代码看起来类似于:

代码语言:javascript
复制
(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是一个过程之外,您还需要将代码打包成如下所示:

代码语言:javascript
复制
(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))))
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39792478

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档