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个测试块的deftest是否会导致相同的问题——即没有异步,没有go等。

此外,即使 analyzer 错误是从几十行开始的,我们也需要看到这些错误。谢谢!

谢谢你回信。我已经创建了一个最小化示例项目: https://github.com/ladislavdubravsky/cljs-test-issue

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