簡體   English   中英

Clojure單元測試with-defs

[英]clojure unit-testing with-redefs

我有這樣的事情:

(ns server.core
  (:require [db.api :as d]))

(defrecord Server [host port instance]
  (start [c]
    (let [connection (d/connect (:host c) (:port c))]
      (assoc c :instance connection)))
  (stop [c]
    ;; close the connection
    ))

(defn new-server
  [host port]
  (map->Server {:host host
                :port port}))

以及單元測試代碼

(ns server.core_test
  (:require [server.core :refer :all]
            [clojure.test :refer :all]))

(deftest server-test
  (testing "Calling start should populate :instance"
    (with-redefs [d/connect (fn [h p] [h p])]
      (let [server (start (new-server "foobar" 12313123))]
        (is (-> server :instance nil? not))))))

使用boot watch test運行上面的代碼將引發類似於以下內容的錯誤:

Unable to resolve var: d/connect in this context

然后我修改測試代碼,因此需要db.api

(ns server.core_test
  (:require [server.core :refer :all]
            [clojure.test :refer :all]
            [db.api :as d]))

我再次運行測試,這次d/connect仍然引用db.api

有什么建議嗎?

您需要在測試代碼中要求db.api ,以便可以訪問var d/connect

(ns server.core_test
  (:require [server.core :refer :all]
            [db.api :as d]
            [clojure.test :refer :all]))

(deftest server-test
  (testing "Calling start should populate :instance"
    (with-redefs [d/connect (fn [h p] [h p])]
      (let [server (start (new-server "foobar" 12313123))]
        (is (-> server :instance nil? not))))))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM