Тестирование кода core.async в ClojureScript
Я пытаюсь протестировать некоторый код core.async, но у меня возникают проблемы при написании тестов. Весь мой тестовый код находится в go
блок, но кажется, что процесс, на котором идет мой тест, не запакован так, как я ожидал.
После того, как я надел actions
канал, я бы ожидал исполнения go
блок для парковки до получения значения, но вместо этого is
функция запускается сразу же, что приводит к сбою моего теста, потому что state-atom
еще не был обновлен.
Вот мой тестовый код:
(deftest tab-change
(async done
(go (>! state/actions (state/TabChange. :return))
(is (= @state/state-atom {:tab :return}))
(done))))
И тестируемый код:
(def actions (async/chan))
(declare update)
(def state-atom (reagent/atom nil))
(go-loop []
(swap! state-atom (partial update (<! actions)))
(recur))
(defprotocol Action
(update [action state]))
(defrecord TabChange [value]
Action
(update [_ state]
(assoc state :tab value)))
Если я изменю свой тестовый код, чтобы использовать put!
и обратный вызов, а не go
блок, тесты проходят:
(deftest tab-change
(async done
(put! state/actions
(state/TabChange. :return)
#(do (is (= @state/state-atom {:tab :return}))
(done)))))
Это, очевидно, не подходит для более сложных тестов, поэтому я надеялся получить некоторое представление о том, что является причиной проблемы с оригинальным тестом.