可以使用环/的Compojure框架看到一个很好的例子:
> lein new compojure sample
> cat sample/test/sample/handler_test.clj
(ns sample.handler-test
(:require [clojure.test :refer :all]
[ring.mock.request :as mock]
[sample.handler :refer :all]))
(deftest test-app
(testing "main route"
(let [response (app (mock/request :get "/"))]
(is (= (:status response) 200))
(is (= (:body response) "Hello World"))))
(testing "not-found route"
(let [response (app (mock/request :get "/invalid"))]
(is (= (:status response) 404)))))
更新
对于出站HTTP调用,您可能会发现with-redefs
有用:
(ns http)
(defn post [url]
{:body "Hello world"})
(ns app
(:require [clojure.test :refer [deftest is run-tests]]))
(deftest is-a-macro
(with-redefs [http/post (fn [url] {:body "Goodbye world"})]
(is (= {:body "Goodbye world"} (http/post "http://service.com/greet")))))
(run-tests) ;; test is passing
在这个例子中,原函数post
返回“Hello world”。在单元测试中,我们使用返回“再见世界”的存根函数暂时覆盖post
。
完整文档is at ClojureDocs。
大多数(所有?)clojure http库都将请求和响应表示为映射,因此您可以直接在测试中构建这些请求而不会嘲笑。 – Lee
依赖注入有什么问题?你是否在自己的职位上使用硬编码的网址?因为你不应该这样做,那很糟糕,mkay。 –