我正在使用鸡计划版本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
问题显然在于我的测试错误,因为我不知道如何 以测试错误理解的形式表示异常。 我已经尝试了列出的实际错误的多种变体, 但没有成功。
具体来说,我该怎么编码中的预期错误 测试错误调用?
答案 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)
告诉测试接受exn
,postgresql
和bounds
类型的复合条件(有关详细信息,请参阅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,并且拥有测试驱动的背景,我最感兴趣的是我的代码是最好的。