如何在 Clojure 中进行集成测试?
How to do integration testing in Clojure?
在 Clojure 中进行集成测试的技术和库是什么。特别是与数据库、环形应用程序、core.async 通道以及任何会产生副作用的事物的交互。
您可以将 ring-mock 用于环形应用程序。创建模拟处理程序并使用它的示例是:
(let [h (-> (POST "/some/url" [] some-resource)
(wrap-defaults api-defaults))]
(let [resp (h (-> (request :post "/some/url")
(header "content-type" "application/json")
(body (generate-string {:foo :bar}))))]
(is (= 303 (:status resp)))
(is (= "" (:body resp)))
(is (= "http://some/place/foo" (get-in resp [:headers "Location"])))))
对于 d/b 交互测试和副作用,我使用 with-redefs 来消除实际的副作用函数并按预期捕获和测试它的参数。我不确定这是否是惯用的,但这是我发现的最简单的方法,例如
(testing "some d/b work"
(let [insert-data (ref {})]
(with-redefs
[d/insert-data<!
(fn [db data] (dosync (alter insert-data assoc :db db)
(alter insert-data assoc :data data)))]
(let [d (your-fn your-args)]
(is (= {:some :expected-result} d))
(is (= {:db {:some :connection-data} :data {:some :expected-data}} @insert-data))))))
你可以在这里使用 atom,过去我在测试一些执行回写工作的代理时不得不使用 refs,而 atom 在那种情况下不起作用。
我使用的主要图书馆是 clojure.test, I only briefly dabbled with property testing using test.check so far. I used Midje 一段时间,但发现 clojure.test 感觉更纯粹,但那是品味。另外,如果您尝试使用 cljs,您不妨坚持使用一种测试框架。
我没有任何使用 core.async 的经验,但 its own tests 看起来是个不错的起点。
在 Clojure 中进行集成测试的技术和库是什么。特别是与数据库、环形应用程序、core.async 通道以及任何会产生副作用的事物的交互。
您可以将 ring-mock 用于环形应用程序。创建模拟处理程序并使用它的示例是:
(let [h (-> (POST "/some/url" [] some-resource)
(wrap-defaults api-defaults))]
(let [resp (h (-> (request :post "/some/url")
(header "content-type" "application/json")
(body (generate-string {:foo :bar}))))]
(is (= 303 (:status resp)))
(is (= "" (:body resp)))
(is (= "http://some/place/foo" (get-in resp [:headers "Location"])))))
对于 d/b 交互测试和副作用,我使用 with-redefs 来消除实际的副作用函数并按预期捕获和测试它的参数。我不确定这是否是惯用的,但这是我发现的最简单的方法,例如
(testing "some d/b work"
(let [insert-data (ref {})]
(with-redefs
[d/insert-data<!
(fn [db data] (dosync (alter insert-data assoc :db db)
(alter insert-data assoc :data data)))]
(let [d (your-fn your-args)]
(is (= {:some :expected-result} d))
(is (= {:db {:some :connection-data} :data {:some :expected-data}} @insert-data))))))
你可以在这里使用 atom,过去我在测试一些执行回写工作的代理时不得不使用 refs,而 atom 在那种情况下不起作用。
我使用的主要图书馆是 clojure.test, I only briefly dabbled with property testing using test.check so far. I used Midje 一段时间,但发现 clojure.test 感觉更纯粹,但那是品味。另外,如果您尝试使用 cljs,您不妨坚持使用一种测试框架。
我没有任何使用 core.async 的经验,但 its own tests 看起来是个不错的起点。