簡體   English   中英

使用core.async進行測試-刷新測試中的go塊嗎?

[英]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塊的通道。 這是一個不包含任何內容的頻道,因為:

  1. go塊試圖放入一個無緩沖的通道,需要一些其他操作來“滿足”它並進行補充操作,以便其繼續執行。
  2. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM