[英]Testing with core.async - flushing go blocks inside a test?
我正在嘗試編寫這樣的測試:
(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塊! 永遠不會執行。 我需要做些什么來沖洗通道嗎?
我看到還有一個類似的懸而未決的問題: 在ClojureScript中測試core.async代碼 。 似乎有一個區別,就是我的被測試代碼中沒有顯式通道。 這是由cljs-http帖子生成的。
我相信您的問題是放錯了括號。
(let [ch (chan)
response {:status 200}]
(go (>! ch response)
ch))
此let
的返回值是go
塊的通道。 這是一個不包含任何內容的頻道,因為:
go
塊試圖放入一個無緩沖的通道,需要一些其他操作來“滿足”它並進行補充操作,以便其繼續執行。 ch
在詞匯上對外界是隱藏的,因此不存在可以執行補充合拍的操作。 如果確實采取了某種措施(或者我們在ch
添加了一個緩沖區,以便第一個put成功),則ch
會放在返回的通道上。
(let [ch (chan)
response {:status 200}]
(go (>! ch response))
ch)
此let
的返回值為ch
,沒有附加的通道將其包裝。 將go
block停放下來,嘗試放置ch
直到類似您的測試可以從中取出。
但是,由於我們最終只是希望構建一個帶有常量的通道,所以go
本身似乎是最簡單的解決方案:
(defn fake-login-success [& _]
(go {:status 200})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.