【问题标题】:chicken scheme srfi-64 test-error problems小鸡方案 srfi-64 测试错误问题
【发布时间】:2016-11-18 04:28:04
【问题描述】:

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

我在这个单元测试包中遇到了测试错误问题。

问题的最小示例:

(需要扩展 srfi-64) (测试开始“错误测试”) (定义(exn-tester) (错误“srfi-64 想要什么?”)) (测试错误“exn-tester”'exn(exn-tester)) (测试结束)

报告中的结果:

%%%% 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

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

具体来说,我应该为 测试错误调用?

【问题讨论】:

    标签: unit-testing testing scheme chicken-scheme


    【解决方案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 了解更多信息)。它可以有其他类型,但在本例中,必须存在这三种类型才能通过测试。

    【讨论】:

    • 非常感谢您完整且内容丰富的回复。
    【解决方案2】:

    根据您的提示,以下方法效果很好:

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

    尝试使用您的定义语法导致“未绑定变量:exn”。 也许我需要额外的扩展才能使用它?

    但是,您的定义语法将引起未来的关注。我才刚刚开始使用 Scheme,并且具有测试驱动背景,我最感兴趣的是我的代码是最好的。

    【讨论】:

    • hm,也许定义包含错误。你能粘贴失败的完整代码吗?
    猜你喜欢
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    相关资源
    最近更新 更多