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

欢迎!请查看 关于 页面以获取更多有关如何工作的信息。

+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 或其他奇怪的解析器错误

在您的案例中, 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)。`
...