这是测试 core.async 功能的可接受方法吗?
Is this an acceptable way to test core.async functionality?
考虑以下单元测试片段:
(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
宏。 This 有很多关于 ClojureScript 测试的细节
(deftest async-test
(testing "Testing some core.async functionality."
(async done
(go
(is (= (<! (go "val")) "val1"))
(done)))))
考虑以下单元测试片段:
(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
宏。 This 有很多关于 ClojureScript 测试的细节
(deftest async-test
(testing "Testing some core.async functionality."
(async done
(go
(is (= (<! (go "val")) "val1"))
(done)))))