这是测试 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 块中。所以我的问题是,这是使用 core.async 功能进行单元测试的最佳方式吗?这里有我缺少一些最佳实践吗?

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

在 Clojure 的情况下,你只需要使用阻塞<!!运算符:

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

在 ClojureScript 的情况下,请使用async宏。这有很多关于在ClojureScript中测试的细节

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

最新更新