0

我有一个要测试的异步基座拦截器:

(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我尝试了另一种解决方案,在测试后的拦截器中添加测试:

(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而不是 chan,我无法将其包装在 aas/<!!中以阻塞,直到它终止。

在这一点上,我被困住了。我能做些什么来测试这种拦截器吗?

4

1 回答 1

2

这种方法怎么样?

(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完成时发布一些东西。

于 2020-04-12T00:38:15.083 回答