这是测试core.async功能的可接受方式吗?

时间:2016-01-24 09:27:22

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

1 个答案:

答案 0 :(得分:3)

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

对于Clojure,您只需要使用阻止NULL运算符:

<!!

对于ClojureScript,使用(deftest async-test (testing "Testing some core.async functionality." (is (= (<!! (go "val")) "val1"))) 宏。 This有很多关于在ClojureScript中进行测试的细节

async