2015-11-18 6 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