2016-01-24 65 views
2

考慮以下單元測試片段:這是測試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")) 

但因爲這是奇怪:(ⅰ)有1個斷言在該試驗中,還測試輸出說有0,並且(ii)測試語句也說有0次失敗,即使有1次失敗。

我想這是因爲(is...)聲明是在一個去塊。所以我的問題是,這是使用core.async功能進行單元測試的最佳方式嗎?這裏有一些我錯過的最佳做法嗎?

回答

3

此問題不是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))))) 
+0

我在例如使用ClojureScript(所以不能用'<!')。第二個代碼片段的問題在於它使用了一個go塊外面的<!',這是非法的。有沒有其他的方法呢? – George

+0

它的工作原理 - 非常感謝將我指向「異步」宏的方向! – George

相關問題