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 文本:Rich的评论24016在CLJ-377上)他认为消息应该报告测试文件行而不是异常抛出的地方。

方法:从错误堆栈跟踪中过滤出堆栈跟踪类前缀{{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

评论者:alexmiller

在GitHub上快速搜索显示,许多人对文件和行功能进行了调用(这个功能被公开为私有)。这些用户可能会因为补丁而出错。可能最好是创建一个新的函数或 arity,而不是移除现有的 arity。

只是粗略一看,但我怀疑你在新的代码里引入了一些反射,特别是这些可能需要另一个类型提示。

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

我需要查阅更多代码才能判断其他问题。看到有测试变量在这里意味着这个函数现在依赖于外部状态,因此需要仔细思考以确保每个调用上下文都有那个全局状态(如果没有,不会以错误的方式失败)。在票务描述的“方法”部分看到你关于这个问题的讨论将很有帮助。

0

评论者:ryfow

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

0

评论者:ryfow

我已经在方法部分填入了一些细节。

我还添加了一个新的补丁 LINE_REPORTING_2.patch,该补丁解决了反射警告,恢复了 {{file-and-line}} 的旧 arity,并增加了人们在测试上下文外调用 {{file-and-line}} 的保护。

0

评论者: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)
期望:arg
实际: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)
期望:arg
实际:false
`

0

评论者:michaelblume

补丁不再适用,但可能 CLJ-1856 已经解决这个问题?

0

评论者:alexmiller

CLJ-1856 未能解决这个问题,但如果在查找位置时过滤掉 clojure.lang.AFn 的错误堆栈,则可能会被解决。这非常具体,也许还应扩展到其他调用路径,但我不确定。

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

0
参考资料:https://clojure.atlassian.net/browse/CLJ-1811(由 ryfow 报告)
...