【问题标题】:Is this an acceptable way to test core.async functionality?这是测试 core.async 功能的可接受方式吗?
【发布时间】:2016-01-24 09:27:21
【问题描述】:

考虑以下单元测试 sn-p:

(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 功能进行单元测试的最佳方式吗?我缺少一些最佳实践吗?

【问题讨论】:

    标签: unit-testing clojure clojurescript core.async


    【解决方案1】:

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

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

    (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)))))
    

    【讨论】:

    • 我在示例中使用了 ClojureScript(所以不能使用 &lt;!!)。第二个 sn-p 的问题在于它在 go 块之外使用了 &lt;!,这是非法的。有没有其他办法解决这个问题?
    • 它起作用了——非常感谢你为我指明了async宏的方向!
    猜你喜欢
    • 1970-01-01
    • 2017-12-02
    • 2013-09-02
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    • 2014-12-26
    • 1970-01-01
    相关资源
    最近更新 更多