2016-08-14 4 views
2

У меня есть проект luminus с некоторыми простыми маршрутами compojure-api. Я добавил carmine для связи с сервером redis, используя макрос wcar* (определенный в services.clj) для совершения звонков, и все работает нормально.Ошибка подключения кармина во время испытаний

Теперь я пытаюсь добавить некоторые тесты, но, кажется, что соединение Redis не работает должным образом во время них, потому что я получаю эту ошибку с lein test:

ERROR Ошибка подключения Carmine

clojure.lang.ExceptionInfo: ошибка соединения Carmine {}

Поскольку он работает в dev е prod среды, я думаю, что это что-то связанное к отсутствует env загрузите среду test, но я не нашел способ ее решить.

Эти соответствующие части кода в использовании:

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)])) 

РЕШЕНИЕ

Добавить текст арматуре с mount/start команды, запускаемый Befor е тесты.

Добавить в 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 'не запущен (для запуска всех состояний call mount/старт)]}] '. Я обновлю вопрос с помощью рабочего кода. – lifeisfoo

+0

Я думаю, вы также должны вызвать '(mount/stop)' после того, как ваши тесты в приборе будут иметь надлежащую тестовую изоляцию (желательно в блоке 'finally'). –

 Смежные вопросы

  • Нет связанных вопросов^_^