【问题标题】:Testing with core.async - flushing go blocks inside a test?使用 core.async 进行测试 - 在测试中刷新 go 块?
【发布时间】:2015-12-05 18:31:05
【问题描述】:

我正在尝试编写这样的测试:

(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。一个区别似乎是我的测试代码中没有明确的通道。这是由 cljs-http 帖子生成的。

【问题讨论】:

    标签: clojure clojurescript core.async reagent


    【解决方案1】:

    我相信您的问题是括号放错了。

    (let [ch (chan)
          response {:status 200}]
        (go (>! ch response)
            ch))
    

    这个let 的返回值是go 块的通道。这是一个不包含任何内容的频道,因为:

    1. go 块正在尝试放置一个无缓冲的通道,需要一些其他操作来“满足”它并执行互补获取,以便继续执行它自己的执行。
    2. ch 在词法上对外界是隐藏的,因此不存在可以执行互补拍摄的操作。

    如果以某种方式确实从中获取了某些东西(或者我们向ch 添加了一个缓冲区,所以第一次放置成功),ch 将被放置在返回的通道上。

    (let [ch (chan)
          response {:status 200}]
        (go (>! ch response))
        ch)
    

    这个let 的返回值是ch,没有额外的通道包装它。 go-block 停在上面,试图穿上ch,直到像你的测试这样的东西可以从中取用。

    但是,由于我们最终只是想构建一个带有常量的通道,go 本身似乎是最简单的解决方案:

    (defn fake-login-success [& _]
      (go {:status 200})
    

    【讨论】:

      猜你喜欢
      • 2014-06-05
      • 2012-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-25
      • 2023-04-07
      • 2013-12-13
      相关资源
      最近更新 更多