gpt4 book ai didi

unit-testing - 通过模拟请求使用异步 api 调用测试组件

转载 作者:行者123 更新时间:2023-12-01 12:31:06 24 4
gpt4 key购买 nike

我仍处于 Cljs 和 Om 的学习阶段。我正在研究编写组件测试。某些组件具有对我创建的 API 的 cljs-http 调用。测试时,我不希望那些 API 调用实际发送请求,因此我正在研究模拟请求并返回固定装置。这是我的示例组件:

(defn async-component [data owner]
(reify
IWillMount
(will-mount [_]
(let [resp (go ((<! (async-call "/") :body))]
(om/update! data [:objects] resp)))
IRender
(render [_]
[:ul
(om/build-all item-component data)])))

(defn async-call [path]
(http/get path {:keywordize-keys true}))

请不要介意代码在语法上是否真的正确,我只是展示它的要点。

我现在想做的是测试这个 async-component 和 API 调用,看看它是否会呈现我模拟请求的装置。这是怎么做到的?我知道 cljs.testasync block 来测试异步代码,但所有示例都显示它测试只有 go 的实际代码块在其中,而不是在更大的背景下。

最佳答案

这里是您可以使用模拟来测试您的组件的一种方式:

(deftest test-async-component
(cljs.test/async done
(with-redefs
[async-call (fn [path]
(let [mock-ch (async/chan 1)
fixture-data {:body {:fixture-with path :and "foobar"}})]
(async/put! mock-ch fixture-data)
mock-ch)]
; At this point we successfully mocked out our data source (the API call)
; the only task that remains is to render our Om component into DOM and inspect it.
; As this task requires utility fns I will reuse the ones in this blog post:
; http://lab.brightnorth.co.uk/2015/01/27/unit-and-browser-testing-om-clojurescript-applications/

(let [c (new-container!)
initial-data {:objects [{:initial-object 42}]}]
; This will mount and render your component into the DOM residing in c.
(om/root async-component initial-data {:target c})

(testing "fixture data gets put into the DOM"
(is (= "foobar" (text (sel1 c :ul)))))

; You can add more tests in this manner, then finally call 'done'.
(done)))))

以上英文代码中采取的步骤:

  1. 编写 async-call 的模拟 fn,返回一个 channel (与原始接口(interface)相同的接口(interface)),并预填充了夹具数据。
  2. 模拟原始 fn(您需要引用它或完全限定 ns)。
  3. 为单元测试目的创建一个新的虚拟 DOM。
  4. 指定不是来自 API 的模拟数据(如果有)。
  5. 将您的组件渲染到 DOM 中(这将在 om/will-mount 运行时调用 async-call,关闭 fixture-data chan).
  6. 观察 DOM 内容。

关于unit-testing - 通过模拟请求使用异步 api 调用测试组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34116750/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com