我如何模拟 sqlKorma?

How do I mock sqlKorma?

我不熟悉 Clojure 中模拟的工作原理。具体来说,我不确定应该如何测试实现 sqlKorma 查询或调用数据库的函数?理想情况下,我希望能够在我的测试中模拟 sqlKorma。

(defn fetch [id]
(->
    (korma/select* :my-table)
    (korma/where {:id id})
    (korma/exec)))

(defn retrieve [id]
  (->
    (fetch id)
    (ring/response)))

我正在使用 Speclj 来测试我的应用程序。

(describe "item"
      (it "is fetched"
          (let [fetched (fetch :test-case)] ;here I want to be able to mock sqlKorma and return an array of 1.
          (should= (count fetch) 1)))

      (it "is retrieved"
          (let [retrieved (retrieve :test-case)]
          (should= (get retrieved :status) 200))))

有几种方法。一种方法是使用不同的数据库进行测试。例如。内存数据库中的 H2。这是首选,因为您不需要模拟并且您也可以测试 SQL 。如果你真的还想模拟你的 fetch 功能,你可以使用 with-redefs:

(defn foo [] [{:foo "bar"}])
(foo) ;;=> [{:foo "bar"}]
(with-redefs [foo (fn [] [{:something "else"}])] (foo))
 ;;=> [{:something "else"}]
(foo) ;;=> [{:foo "bar"}]

https://clojuredocs.org/clojure.core/with-redefs