2015-11-18 61 views

回答

6

您可以将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)))))) 

你可以在这里使用的原子,从历史上看,我不得不用裁判的时候我是测试一些代理商认为做回写工作,原子并没有在那种情况下工作。

我使用的主要图书馆是clojure.test,我到目前为止只使用test.check进行过简单的财产测试。我用Midje一段时间,但发现clojure.test感觉更纯粹,但这是品尝。此外,如果你冒险进入cljs,你可以坚持一个测试框架。

我没有任何使用core.async的经验,但its own tests看起来是一个很好的开始。

+1

这个答案对单元测试更有帮助。集成测试的设置高度依赖于环境。 – Ming