参与2024年Clojure状况调查分享您的想法!点击此处

欢迎!请访问关于页面了解如何使用本网站。

+3
测试

如果在测试执行过程中抛出异常,则文件名和行号通常对于查找问题没有太多帮助。例如,以下代码:

`
(require '[clojure.test :refer [deftest test-var]])

(deftest foo
(meta))

(test-var #'foo)
`

将会在AFn.java:429处输出错误。

`
ERROR in (foo) (AFn.java:429)
未捕获的异常,不在断言中。
期望:nil
实际:clojure.lang.ArityException: 传递给:core/meta--4144的参数数量错误(0)
at clojure.lang.AFn.throwArity (AFn.java:429)

clojure.lang.AFn.invoke (AFn.java:28)
user/fn (error_reporting.clj:4)
clojure.test$test_var$fn__7670.invoke (test.clj:704)
clojure.test$test_var.invoke (test.clj:704)
user$eval6.invoke (error_reporting.clj:6)
clojure.lang.Compiler.eval (Compiler.java:6782)
...etc

`

(链接:http://dev.clojure.org/jira/browse/CLJ-377?focusedCommentId=24016&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-24016 文字:关于CLJ-377的第24016条Rich的评论)认为信息应该报告测试文件行而不是异常抛出位置。

方法:从顶部错误堆栈中过滤出{{clojure.lang.AFn}}类前缀。

应用补丁后,上述示例输出为error_reporting.clj:4

`
ERROR in (foo) (error_reporting.clj:4)
未捕获的异常,不在断言中。
期望:nil
实际:clojure.lang.ArityException: 传递给:core/meta--4141的参数数量错误(0)
at clojure.lang.AFn.throwArity (AFn.java:429)

clojure.lang.AFn.invoke (AFn.java:28)
user$fn__3.invokeStatic (error_reporting.clj:4)
user/fn (error_reporting.clj:3)
clojure.test$test_var$fn__114.invoke (test.clj:705)
clojure.test$test_var.invokeStatic (test.clj:705)
clojure.test$test_var.invoke (test.clj:-1)
user$eval6.invokeStatic (error_reporting.clj:6)
user$eval6.invoke (error_reporting.clj:-1)
clojure.lang.Compiler.eval (Compiler.java:6939)
...etc

`

补丁:clj-1811.patch

8 个答案

0

评论者:ryfow

描述中的示例文件

0
by

评论由: alexmiller 提出

在 Github 上进行快速搜索显示,许多情况下人们会调用(诚然是私有的)文件和行功能。这些用户会因该补丁而失效。也许创建一个新的函数或新的元数,而不是删除现有的元数会更好。

仅凭肉眼查看,但我怀疑你在新代码中引入了反射,特别是在这些地方可能需要另一个类型提示。

  1. (.getName (.getClass (:test (meta test-var))))
  2. (= (.getClassName %) test-var-class-name)

我需要查看更多代码才能对其他所有事物做出判断。看到测试变量意味着这个函数现在依赖于外部状态,因此需要仔细思考以确保每个调用上下文都有该全局状态(或者如果不具有该全局状态,不会以糟糕的方式失败)。在票据描述的“方法”部分看到你对这一点的讨论会很有帮助。

0
by

评论者:ryfow

为解决此问题进行的第二次尝试修补。纠正了问题(链接: http://dev.clojure.org/jira/browse/CLJ-1811?focusedCommentId=41115&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-41115 文本:Alex 指出的)

0
by

评论者:ryfow

我在方法部分填充了一些详细信息。

我还添加了一个新的补丁 LINE_REPORTING_2.patch,该补丁解决反射警告、恢复 {{file-and-line}} 旧元数,并为从测试上下文之外调用 {{file-and-line}} 提供保护。

0
by

评论者:ryfow

在与同事 James 讨论问题的时候,我意识到这个修复有助于共享函数调用 {{(is)}}。注意,在应用 LINE_REPORTING_2.patch 后,这段示例代码报告行 7。这行测试代码通常比共享函数行更有用。

`
ryans-mbp:~/oss/clojure% cat -n error_reporting.clj

 1  (require '[clojure.test :refer [deftest test-var is]])
 2
 3  (defn shared-code [arg]
 4    (is arg))
 5
 6  (deftest test-shared-code
 7    (shared-code false))
 8
 9  (test-var #'test-shared-code)

ryans-mbp:~/oss/clojure% java -jar ~/.m2/repository/org/clojure/clojure/1.7.0/clojure-1.7.0.jar ./error_reporting.clj

在 (test-shared-code) (error_reporting.clj:4) 处失败
期望:参数
实际:false
ryans-mbp:~/oss/clojure% java -jar target/clojure-1.8.0-master-SNAPSHOT.jar ./error_reporting.clj

在(test-shared-code)中失败 (error_reporting.clj:7)
期望:参数
实际:false
`

0
by

评论由:michaelblume 发布

补丁无法再应用,但也许CLJ-1856已经解决了这个问题?

0
by

评论由: alexmiller 提出

CLJ-1856 没有解决这个问题,但如果在查找位置时过滤掉clojure.lang.AFn,这可能会被解决。这非常具体——也许应该将范围扩展到其他调用路径,但不确定。

附上了一个应用此过滤的新补丁。

0
by
...