2024Clojure 状态调查! 中分享您的想法。

欢迎!有关此工作原理的更多信息,请参阅关于 页面。

+1
ClojureScript
编辑

使用

[cljs.test :refer-macros [deftest is testing run-tests async]] [cljs.core.async :refer [<! go]]

我这样编写异步测试

(deftest some-test
  (async done
    (go
      (testing "Sanity check" (is (= 1 1)))         
              .                 
              .                               -> n tests
              .           
      (testing "Sanity check" (is (= 1 1)))     
      (done))))

当 n=21 个测试时一切正常,超过这个数量时,从 cljs.analyzer 得到一个无法理解的错误,行数达到数千行。我是否在编写这些测试时犯了错误?

2 答案

+2

您好,Ladislav

此问题与 cljs 或 test.check 无直接关系

它与 go 宏有关

go 宏会重写其主体

您可以在您的 repl 中运行 (macroexpand '(go 1)) 以查看它。
即使是像 1 这样简单的形式,也会变成一个更大的形式,包含大量的“状态机”和其他内容。
1 会转化为约 2k 字符长的形式
更复杂一些,如 (go (inc (<! (go 1)))),会变成约 4k 字符
它还会继续增长。

在某些情况下,这种“扩展的 go 代码”增长过多,导致 StackOverflow 或其他奇怪的 analyzer 错误

在这种情况下,您的 testing / is 宏会扩展成一个大代码,因此您会很快遇到“太长”的形式。

我明白了,谢谢。我已经阅读了有关go块和最佳实践的入门知识(https://clojure.org/guides/core_async_go),但没有深入研究实施细节。
+1

在此报告中,我们需要更多信息。此示例实际上结合了几个不同的功能,因此并不真正感觉是最小的。

例如,包含21个testing块的deftest是否产生相同的问题——即没有异步,没有go等。

此外,即使是在前几十行,我们也需要看到分析器错误。谢谢!

感谢您的回复。我创建了一个最小示例项目: https://github.com/ladislavdubravsky/cljs-test-issue

异步和go都需要存在。在这个最小示例中,我得到的错误实际上不同
`执行错误(StackOverflowError)在java.net.URLStreamHandler/parseURL (URLStreamHandler.java:312)。`
...