如何在Clojure中进行集成测试?

aka*_*lou 4 testing integration-testing clojure ring core.async

在Clojure中进行集成测试的技术和库是什么?特别是与数据库,环应用程序,core.async通道,产生副作用的任何东西的交互.

Mar*_*her 6

您可以将ring-mock用于ring应用程序.创建模拟处理程序并使用它的示例是:

(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"])))))
Run Code Online (Sandbox Code Playgroud)

对于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))))))
Run Code Online (Sandbox Code Playgroud)

你可以在这里使用原子,历史上我在测试一些做回写工作的代理时必须使用refs,并且原子在那种情况下不起作用.

我使用的主库是clojure.test,到目前为止我只是简单地使用test.check进行了属性测试.我使用了Midje一段时间,但发现clojure.test感觉更纯净,但这很难尝.另外,如果你想进入cljs,你可以坚持使用一个测试框架.

我没有使用core.async的经验,但它自己的测试看起来像是一个很好的起点.

  • 这个答案对单元测试更有帮助。集成测试的设置高度依赖于环境。 (2认同)