私はこのようなテストを書こうとしています:
(deftest login-form-rendering
(async done (with-redefs [http/post fake-login-success]
(with-mounted-component (c/login-form login!)
(fn [c div]
(.click (.getElementById js/document "Login"))
(is (= (:page @app-state) :location)))))
(done)))
私はこのモックを持っています:
(defn fake-login-success [& _]
(let [ch (chan)
response {:status 200}]
(go (>! ch response)
ch)))
ログイン関数は次のことを行います。
(defn login! [username password]
(go (let [result (->> {:form-params {:username @username :password @password}}
(http/post "/api/login")
(<!))
{status :status body :body} result]
(case status
401 (swap! app-state assoc :page :bad-login)
200 (swap! app-state assoc :page :location)))))
ログイン フォームは、onClick のコールバックを受け取る試薬コンポーネントです。app-state は、グローバルにアクセス可能なアトムです。
私が直面している問題は、ログイン内の go ブロックです! 実行されることはありません。チャンネルなどをフラッシュするために何かする必要がありますか?
同様の未回答の質問もあります: Testing core.async code in ClojureScript。1 つの違いは、テスト対象のコードに明示的なチャネルがないことです。それは cljs-http 投稿によって生成されています。