unit-testing - 这是测试 core.async 功能的可接受的方法吗?

标签 unit-testing clojure clojurescript core.async

考虑以下单元测试片段:

(deftest async-test
 (testing "Testing some core.async functionality."
  (go (is (= (<! (go "val")) "val1")))))

运行测试结果:

Ran 1 tests containing 0 assertions. 0 failures, 0 errors.

FAIL in () (at repl:253:51) expected: (= (<! (go "val")) "val1")  
actual: (not (= "val" "val1"))

但这很奇怪,因为:(i) 此测试中有 1 个断言,但测试输出显示有 0 个断言,并且 (ii) 测试语句还显示有 0 次失败,尽管有 1 次失败。

我想这是因为 (is...) 断言位于 go block 中。所以我的问题是,这是使用 core.async 功能进行单元测试的最佳方法吗?这里我缺少一些最佳实践吗?

最佳答案

此问题不限于 core.async,而是所有多线程代码。您需要确保测试断言由启动测试的线程运行,因为该线程还收集并打印所有测试的结果。

对于 Clojure,您只需要使用阻塞 <!!运算符:

(deftest async-test
 (testing "Testing some core.async functionality."
  (is (= (<!! (go "val")) "val1")))

对于 ClojureScript,请使用 async宏。 This有大量有关 ClojureScript 测试的详细信息

(deftest async-test
  (testing "Testing some core.async functionality."
    (async done
      (go
        (is (= (<! (go "val")) "val1"))
        (done)))))

关于unit-testing - 这是测试 core.async 功能的可接受的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34974105/

相关文章:

clojure - 如何指定lazy-seq生成函数?

clojurescript - 如何获得最新版本的 clojurescript 与 lein-cljsbuild 一起使用(无需 fork )?

database - 用于读取/保存数据到数据库的 .NET 单元测试

unit-testing - 通过 typescript 使用部分形状进行单元测试

objective-c - 如何使用 OCMock 在不同的线程上正确 stub 方法?

maven - 如何删除通过“lein install”安装的本地软件包?

clojure - 如何将 figwheel 与环服务器集成以实现后端自动重新加载?

protocols - 在 ClojureScript 中扩展协议(protocol)以从 native js 对象中获取值

google-closure-compiler - google-closure 编译器高级优化正在修改 navigator.battery.level 导致 TypeError

python - 单元测试的真正简单解释是什么?