请在 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 代码”增长太多,导致栈溢出或其他奇怪的 分析器错误。

在您的情况下,测试 / is 宏会扩展成大量代码,所以您很快就会有一个“太长”的格式。

我明白了,谢谢。我读了一些关于go块的初步知识和最佳实践(https://clojure.org/guides/core_async_go),但没有深入研究实现细节。
+1

在这份报告中我们需要更多信息。这个例子实际上结合了几个不同的功能,所以它并不真正感觉是最简的。

例如,一个包含21个test块的deftest会产生相同的问题——即没有async,没有go等。

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

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

async和go都需要存在。这个最小的例子中我得到的确切错误是不同的
`执行错误(StackOverflowError)在java.net.URLStreamHandler/parseURL (URLStreamHandler.java:312)。`
...