Каковы методы и библиотеки для проведения интеграционных тестов в Clojure. В частности, взаимодействие с базами данных, кольцевыми приложениями, каналами core.async, тем, что создает побочный эффект.Как сделать интеграционное тестирование в Clojure?
ответ
Вы можете использовать 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 выглядят как хорошее место для начала.
Этот ответ более полезен для модульного тестирования. Настройка тестирования интеграции сильно зависит от обстоятельств. – Ming