1

我正在尝试使用Karmashadow-cljs作为测试运行器将 ClojureScript 测试从“Chrome Headless”迁移到jsdom 。

需要访问 DOM 或浏览器 API 的常规测试工作正常。但是使用的异步测试cljs.core.async/go不起作用。基本上,里面没有任何东西go被执行。

有谁知道可能出了什么问题?我错过了一些配置吗?它是唯一jsdom的问题还是cljs.core.async互操作性问题?

我在下面放了一个简单的测试示例

(ns async-tests
  (:require [cljs.test :refer [deftest async]]
            [cljs.core.async :refer [go <! timeout]]))

(deftest async-go-test
  (async done
    (.log js/console "Before go is printed")
    (go
      (.log js/console "After go is never printed")
      (<! (timeout 1))
      (done))))

我在控制台中得到的结果是

LOG: 'Testing async-tests'
LOG: 'Before go is printed'
WebKit 537.36 (undefined 0.0.0): Executed 159 of 185 SUCCESS (0 secs / 0.589 secs)
WebKit 537.36 (undefined 0.0.0) ERROR
Disconnected, because no message in 30000 ms.

使用的库版本:

  "devDependencies": {
    "jsdom": "^16.4.0",
    "karma": "^5.2.3",
    "karma-cljs-test": "^0.1.0",
    "karma-jsdom-launcher": "^8.0.2",
    "shadow-cljs": "2.10.19"
  }

业力配置:

module.exports = function (config) {
    config.set({
        browsers: ['jsdom'],
        basePath: 'target',
        files: ['ci.js'],
        frameworks: ['cljs-test'],
        colors: true,
        logLevel: config.LOG_INFO,
        client: {
            args: ["shadow.test.karma.init"]
        },
        jsdomLauncher: {
            jsdom: {
                resources: "usable",
                runScripts: "dangerously",
                pretendToBeVisual: true
            }
        }
    })
};
4

1 回答 1

1

我想对 Clojure 社区说“谢谢”,它帮助我找到了解决此问题的方法,尤其是 @thheller。根本原因尚未找到,但可能是使用不同库范围的结果。

解决方法

您必须goog.async.nextTick使用 js/setTimeout

例子

创建jsdom-setup命名空间

(ns jsdom-setup)

(set! (.. js/window -goog -async -nextTick) js/setTimeout)

并将其添加到“shadow-cljs.edn”内的测试 JS 输出中

:builds {:karma {:target :karma
                 :output-to  "output/tests-bundle.js"
                 :ns-regexp "(setup-jsdom|[.-]tests$)"}}

链接

Clojure Slack 讨论

于 2021-01-14T12:36:38.173 回答