В Clojure, как провести модульное тестирование асинхронного перехватчика c Pedestal? - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть асинхронный c Перехватчик пьедестала, который я хочу проверить:

(def my-interceptor
  (io.pedestal.interceptor/interceptor
    {:name  :my-interceptor
     :enter (fn [context]
              (as/go
                (do
                  (Thread/sleep 1000)
                  (assoc context :answer 42))))}))

Сначала я попробовал наивный тест:

(deftest my-test
  (is (= 42
         (:answer (io.pedestal.interceptor.chain/execute {} [my-interceptor])))))

Это не работает, потому что chain/execute возвращает nil при наличии асинхронных c перехватчиков. Я попробовал другое решение, добавив тест в перехватчик сразу после тестируемого:

(deftest my-test
  (io.pedestal.interceptor.chain/execute
    {}
    [my-interceptor
     (io.pedestal.interceptor/interceptor
       {:name  :test
        :enter (fn [context]
                 (is (= 41 (:answer context))) ; should fail
                 context)})]))

Однако это не работает, потому что тест завершается до того, как тест будет выполнен, и, таким образом, успешно ... даже если тест не пройден через секунду после:

Ran 1 test containing 0 assertions.
No failures.

FAIL in (my-test) (somefile_test.clj:49)
expected: (= 41 (:answer context))
  actual: (not (= 41 42))

На практике мой набор тестов (с использованием Kaocha) не работает, потому что есть deftest без подтверждения.

Учитывая, что chain/execute возвращает nil и не чан, я не могу обернуть его в as/<!!, чтобы заблокировать, пока он не закончится.

В этот момент я застрял. Могу ли я что-нибудь сделать, чтобы проверить такие перехватчики?

1 Ответ

1 голос
/ 12 апреля 2020

Как насчет этого подхода?

(require '[clojure.test :as test])
(require '[clojure.core.async :as async)

(test/deftest async-test []
 (let [c (async/chan)]
      (future (println "Running mah interceptors") (async/>!! c :done))
      (test/is (= :done (async/<!! c)))
      (async/close! c)))

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

...