鸡计划srfi-64测试错误问题

时间:2016-11-18 04:28:04

标签: unit-testing testing scheme chicken-scheme

我正在使用鸡计划版本4.9.0.1并正在开发一个 单元测试套件使用单元测试包srfi-64。

我在此单元测试包中遇到测试错误。

问题的最小例子:

(require-extension srfi-64)
(test-begin "error testing")
(define (exn-tester)
  (error "What does srfi-64 want?"))
(test-error "the exn-tester" 'exn (exn-tester))
(test-end)

报告中的结果:

%%%% Starting test error testing
Group begin: error testing
Test begin:
  test-name: "the exn-tester"
Test end:
  result-kind: fail
  actual-error: #<condition: (exn)>
  expected-error: exn
Group end: error testing
# of unexpected failures  1

问题显然在于我的测试错误,因为我不知道如何 以测试错误理解的形式表示异常。 我已经尝试了列出的实际错误的多种变体, 但没有成功。

具体来说,我该怎么编码中的预期错误 测试错误调用?

2 个答案:

答案 0 :(得分:1)

SRFI规范本身基本上说“它依赖于实现”,但在查看代码后,您似乎可以简单地将它传递给谓词:

(require-extension srfi-64)
(test-begin "error testing")
(define (exn-tester)
  (error "What does srfi-64 want?"))
(test-error "the exn-tester" (condition-predicate 'exn) (exn-tester))
(test-end)

请注意,在CHICKEN社区中,test egg是事实上的测试蛋。但是,它目前无法测试特定的异常类型。我曾经为Postgres egg的测试套件编写了这个宏:

(define-syntax test-error*
  (syntax-rules ()
    ((_ ?msg (?error-type ...) ?expr)
     (let-syntax ((expression:
                   (syntax-rules ()
                    ((_ ?expr)
                     (condition-case (begin ?expr "<no error thrown>")
                                     ((?error-type ...) '(?error-type ...))
                                     (exn () (##sys#slot exn 1)))))))
      (test ?msg '(?error-type ...) (expression: ?expr))))
   ((_ ?msg ?error-type ?expr)
    (test-error* ?msg (?error-type) ?expr))
   ((_ ?error-type ?expr)
     (test-error* (sprintf "~S" '?expr) ?error-type ?expr))))

使用方法如下:

 (test-error* "Result value error for out of bounds row"
              (exn postgresql bounds)
              (value-at (query conn "SELECT NULL") 0 1))

(exn postgresql bounds)告诉测试接受exnpostgresqlbounds类型的复合条件(有关详细信息,请参阅SRFI-12)。它可以有其他类型,但在这个例子中,这三个必须存在才能通过测试。

答案 1 :(得分:0)

根据您的提示,以下效果非常好:

(require-extension test)

test-begin "error-testing")
(define (exn-tester)
  (error "What does srfi-64 want?"))
(test-error  (exn-tester))
(test-end "error-testing")

尝试使用您的define-syntax导致&#34;未绑定变量:exn&#34;。 也许我需要额外的扩展才能使用它?

但是,您的define-syntax将保证未来的关注。我刚刚开始使用Scheme,并且拥有测试驱动的背景,我最感兴趣的是我的代码是最好的。