2016-08-14 19 views
2

我有一個簡單的compojure-api路線的luminus項目。 我已經添加carmine與redis服務器通信,使用宏(在services.clj中定義)調用它,並且一切正常。測試期間胭脂紅連接錯誤

現在,我嘗試添加一些測試,但目前看來,他們在Redis的連接不正常工作,因爲我收到此錯誤與lein test

ERROR胭脂紅連接錯誤

clojure.lang.ExceptionInfo:胭脂紅連接錯誤{}

由於它的工作在devëprod的環境中,我認爲這是一些相關的在test環境中缺少env加載,但我沒有找到解決的辦法。

這些正在使用的代碼的相關部分:

test.clj

(ns app.test.handler 
    (:require [clojure.test :refer :all] 
      [ring.mock.request :refer :all] 
      [app.handler :refer :all])) 

(deftest test-app 
    (testing "redis ping" 
    (let [response ((app) (request :get "/api/redis-ping"))] 
     (is (= 200 (:status response)))))) 

services.clj

(ns app.routes.services 
    (:require [ring.util.http-response :refer :all] 
      [compojure.api.sweet :refer :all] 
      [schema.core :as s] 
      [app.config :refer [env]] 
      [clojure.tools.logging :as log] 
      [mount.core :refer [defstate]] 
      [taoensso.carmine :as car :refer (wcar)])) 

(defmacro wcar* [& body] `(car/wcar 
          {:spec {:host (:redis-host env) :port (:redis-port env)}} 
          [email protected])) 

(defapi service-routes 
    (context "/api" [] 
      :tags ["myapi"] 

     (GET "/redis-ping" [] 
       :return String 
       :summary "A redis client test." 
       (ok (wcar* (car/ping "hello")))))) 

handler.clj

(ns app.handler 
    (:require [compojure.core :refer [routes wrap-routes]] 
      [app.routes.services :refer [service-routes]] 
      [compojure.route :as route] 
      [app.env :refer [defaults]] 
      [mount.core :as mount] 
      [app.middleware :as middleware])) 

(mount/defstate init-app 
       :start ((or (:init defaults) identity)) 
       :stop ((or (:stop defaults) identity))) 

(def app-routes 
    (routes 
    #'service-routes 
    (route/not-found 
     "page not found"))) 


(defn app [] (middleware/wrap-base #'app-routes)) 

Profiles.clj

{:profiles/dev {:env {:redis-host "127.0.0.1" :redis-port 6381}} 
:profiles/test {:env {:redis-host "127.0.0.1" :redis-port 6381}}} 

Config.clj

(ns app.config 
    (:require [cprop.core :refer [load-config]] 
      [cprop.source :as source] 
      [mount.core :refer [args defstate]])) 

(defstate env :start (load-config 
         :merge 
         [(args) 
         (source/from-system-props) 
         (source/from-env)])) 

SOLUTION

添加一個文本夾具與同時befor執行的mount/start命令e測試。

添加到test.clj

(defn my-test-fixture [f] 
    (mount/start) 
    (f)) 

(use-fixtures :once my-test-fixture) 
+0

你可以顯示你的'app.config/env'定義嗎? –

+0

我剛剛將它添加到問題 – lifeisfoo

回答

0

您正在使用mount來管理你的應用程序狀態的生命週期。我認爲你沒有在你的測試中調用(mount/start),因此你的app.config/env狀態沒有正確初始化。另一方面,當你開始你的應用程序(mount/start)可能被調用,因此它的工作正常。

+0

你說得對。嘗試在測試開始時記錄'env'值將導致:';;測試app.test.handler ;; ... #object [mount.core.DerefableState 0x6bf86b4a {:status:ready,:val #object [mount.core.NotStartedState 0x59eac843'#'app.config/env'未啓動(要啓動所有狀態,請調用mount /開始)]}]'。我將使用工作代碼更新問題。 – lifeisfoo

+0

我想你也應該在夾具中測試之後調用'(mount/stop)'來進行適當的測試隔離(最好在'finally'塊中)。 –