Тестирование кода 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)))))

Это, очевидно, не подходит для более сложных тестов, поэтому я надеялся получить некоторое представление о том, что является причиной проблемы с оригинальным тестом.

0 ответов

Другие вопросы по тегам