2013-12-11 1 views
2

Я написал clojure webapp, который очень похож на пример webapp, заданный as the friend exmaple. У меня написано небольшое испытание, используя ring-mock, чтобы проверить, работает ли проверка подлинности . Написав этот тест, я нашел какое-то поведение, которого я не понимаю.Compojure и Friend, где находится состояние в этом примере

См. Следующий код в качестве примера.

(let [route "/login" 
     login-post (body (request :post route) 
         {"username" "Username" "password" "Password"})] 
    (println (secured-app login-post)) 
    (println (secured-app login-post))) 

Первый println возвращает правильный результат:

{:status 303, 
:headers 
{"Set-Cookie" 
    ("ring-session=ENCRYPTED-STUFF;Path=/"), 
    "Location" "/"}, 
:body ""} 

Но второй один возвращает ошибку входа в систему:

{:status 302, 
:headers 
{"Location" "http://localhost/login?&login_failed=Y&username="}, 
:body ""} 

Где-то в этом коде есть состояние быть «передано» от первый запрос обрабатывается вторым запросом (secured-app login-post), но я не вижу его.

Когда я, например, запустить это заявление:

(println (secured-app(body (request :post "/login") 
          {"username" "Username" "password" "Password"}))) 

в несколько раз Repl, я всегда получаю первый должный результат.

Откуда взялось это поведение, и где это государство в этом примере?

+0

Я сделал небольшую библиотеку для хранения/воссоздания запросов, в комплекте с телом запроса, являющимся потоком, который ожидает кольцо: https://github.com/noisesmith/groundhog Он может быть добавлен как обработчик звонка, который захватывает запросы поскольку они входят – noisesmith

ответ

3

Функция ring.mock.request/body превращает данные данного тела в изменяемый ByteArrayInputStream. Это означает, что обычно, как только ваш запрос был передан через приложение, поток тела был прочитан (обычно на ring.middleware.params/assoc-form-params, который вызывает запрос slurp на теле запроса) и теперь пуст.

Другими словами, если вы тестируете кольцевое приложение с фальшивым кольцом, вы никогда не должны повторно использовать запрос с телом. Вероятно, лучше всего всегда создавать новый запрос.