asynchronous - ClojureScript cljs.core.async/go 在 jsdom 中不起作用
问题描述
我正在尝试使用Karma和shadow-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
}
}
})
};
解决方案
我想对 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$)"}}
链接
推荐阅读
- vue.js - 在 Vue 测试中使用 Jest 调用方法
- php - 使用 Ajax 在下拉列表中显示与城市关联的地址
- php - 循环由关联数组组成的数组
- javascript - 为什么 new Date('2015-07-01 01:00:00+00:00') 适用于 chrome 但不适用于 safari?
- python - 根据每行前一行中的值更新熊猫数据框当前行属性
- h.264 - 如何将切片分离为多个切片h264流中的独立帧?
- java - 如何仅替换列表的第一个元素
使用 java 流而不对列表的其余部分进行任何更改? - git - 将 GitLab 6.72 服务器迁移到 Gitlab 12.1.6 服务器
- java - 如何使用 Java 连接到 Google Cloud Spanner
- c# - 我们如何使用 smartsheet C# SDK 一次更新 smartsheet 中的多个列?