请在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就会变成一个约2千字符长的形式。
更复杂的形式,如(go (inc (<! (go 1)))),将变成约4千字符。
并且它会不断增长。

在某些情况下,这种“扩展Go代码”会变得很大,导致StackOverflow或其他奇怪的解析器错误。

在您的情况下,testing / is 宏会展开成大量的代码,因此您很快就会有一个“太长”的形式。

by
我明白了,谢谢。我已经阅读了关于Go块和最佳实践的概述(《[链接]》(https://clojure.org/guides/core_async_go)),但并没有深入到实现细节。
+1 投票
by

在这个报告中,我们需要更多信息。这个例子实际上结合了几个不同的特性,所以并不算是最小化版本。

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

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

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

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