我写了一个看起来很像的clojure webapp
给出as the friend exmaple的示例webapp。我有
使用ring-mock
编写了一个小测试来测试身份验证
工作正常。写这个测试我发现了一些我不理解的行为。
请参阅以下代码作为示例。
(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 :(得分:3)
ring.mock.request/body
函数将给定的主体数据转换为可变的ByteArrayInputStream。这意味着通常,一旦您的请求通过应用程序传递,正在读取正文流(通常是ring.middleware.params/assoc-form-params
,它会在请求正文上调用slurp
),现在为空。
换句话说,如果您使用ring-mock测试环形应用程序,则不应重复使用正文的请求。最好总是创建一个新请求。