Я пытаюсь проверить свою маршрутизацию изолированно, используя Midje. Для некоторых маршрутов, попадающих в базу данных, у меня нет проблем с использованием (provided ...)
для изоляции маршрута от реального вызова базы данных. Я представил Friend для аутентификации, и мне не удалось подделать вызов функции учетных данных.
Моя функция учетных данных выглядит так (она реализована так, потому что я пока не хочу, чтобы она вызывалась):
(defn cred-fn
[creds]
(println (str "hey look I got called with " creds))
(throw (Exception.)))
Промежуточное ПО для маршрутов выглядит следующим образом:
(def app
(-> app-routes
(wrap-json-body {:keywords? true :bigdecimals? true})
wrap-json-response
(wrap-defaults defaults)
(friend/authenticate
{:unauthorized-handler json-auth/login-failed
:workflows [(json-auth/json-login
:login-uri "/login"
:login-failure-handler json-auth/login-failed
:credential-fn auth/cred-fn)]})
(ring-session/wrap-session)))
Я также пробовал без использования рабочего процесса auth-json, реализация маршрутов выглядит почти идентично, и я могу добавить, если это поможет, но я получаю тот же результат.
И тогда мои тесты выглядят так (с использованием кольцевого макета):
(defn post [url body]
(-> (mock/request :post url body)
(mock/content-type "application/json")
app))
(fact "login with incorrect username and password returns unauthenticated"
(:status (post "/login" invalid-auth-account-json)) => 401
(provided
(auth/cred-fn anything) => nil))
(fact "login with correct username and password returns success"
(:status (post "/login" auth-account-json)) => 200
(provided
(auth/cred-fn anything) => {:identity "root"}))
Затем я получаю следующий вывод при выполнении тестов:
hey look I got called with {:password "admin_password", :username "not-a-user"}
FAIL at (handler.clj:66)
These calls were not made the right number of times:
(auth/cred-fn anything) [expected at least once, actually never called]
FAIL "routes - authenticated routes - login with incorrect username and password returns unauthenticated" at (handler.clj:64)
Expected: 401
Actual: java.lang.Exception
clojure_api_seed.authentication$cred_fn.invoke(authentication.clj:23)
hey look I got called with {:password "admin_password", :username "root"}
FAIL at (handler.clj:70)
These calls were not made the right number of times:
(auth/cred-fn anything) [expected at least once, actually never called]
FAIL "routes - authenticated routes - login with correct username and password returns success" at (handler.clj:68)
Expected: 200
Actual: java.lang.Exception
clojure_api_seed.authentication$cred_fn.invoke(authentication.clj:23)
Итак, из того, что я вижу, предоставленное заявление не вступает в силу, и я не уверен, почему. Есть идеи?