2016-08-14 10 views
2

私はいくつかの単純なcompojure-apiルートを持つluminusプロジェクトを持っています。 私は、wcar*マクロ(services.cljで定義されています)を使って呼び出しを行うと、すべてがうまく動作するように、carmineを追加しました。テスト中のCarmine接続エラー

私はlein testと、このエラーを受信して​​いますので、今、私は、いくつかのテストを追加しようとしているが、Redisの接続がそれらの間に正常に動作しないと思われています:

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

012:

これらは、使用中のコードの関連部分であります

(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テスト。あなたは、アプリケーションの状態のライフサイクルを管理するためにmountを使用している

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

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

'app.config/env'定義を表示できますか? –

+0

私はちょうど質問にそれを加えました – lifeisfoo

答えて

0

test.cljに追加します。私はあなたのテストであなたのapp.config/env州が正しく初期化されていないと呼んでいないと思います。一方、アプリケーションを起動するときには、おそらく(mount/start)が呼び出され、正しく動作しています。

+0

あなたはそうです。テストの開始時に 'env'値を記録しようとすると、' ;;テストapp.test.handler ;; ... #object [mount.core.DerefableState 0x6bf86b4a {:ステータス:ready、:val#オブジェクト[mount.core.NotStartedState 0x59eac843 '#' app.config/env 'は起動していません。開始)]}] '。質問を作業コードで更新します。 – lifeisfoo

+0

適切なテスト分離(好ましくは 'finally'ブロック)を行うために、フィクスチャでのテストの後に'(mount/stop) 'を呼び出すべきだと思います。 –

関連する問題