使用Plug.Adapters.Test.Conn测试multipart / form-data

时间:2016-04-07 02:34:35

标签: forms http elixir

以下是我正在使用的示例代码:

@body """
  --13eba0c1a6344d0ca6850a87303ced0f
  Content-Disposition: form-data; name="exists"

  overwrite
  --13eba0c1a6344d0ca6850a87303ced0f
  Content-Disposition: form-data; name="file"; filename="10.jpg"
  Content-Type: image/jpeg

  <content>
  --13eba0c1a6344d0ca6850a87303ced0f--
  """

test "a test" do
  headers = [
    {"Content-Type", "multipart/form-data; boundary=13eba0c1a6344d0ca6850a87303ced0f"},
    {"Content-Length", byte_size(@body)}
  ]
  conn = %Plug.Conn{req_headers: headers}
  |> Plug.Adapters.Test.Conn.conn(:post, "/a/post/path", @body)

  IO.puts "Conn headers: #{inspect conn.req_headers}"
  IO.puts "Conn adapter body:\n #{elem(conn.adapter, 1).req_body}\n-------------------------"
  IO.puts "Conn body_params before Parser: #{inspect conn.body_params}"
  conn = Plug.Parsers.call(conn, Plug.Parsers.init(parsers: [Plug.Parsers.MULTIPART],  pass: ["*/*"]))
  IO.puts "Conn body_params after Parser: #{inspect conn.body_params}"
end

这是控制台中的输出:

Conn headers: [{"Content-Type", "multipart/form-data; boundary=13eba0c1a6344d0ca6850a87303ced0f"}, {"Content-Length", 263}]
Conn adapter body:
 --13eba0c1a6344d0ca6850a87303ced0f
Content-Disposition: form-data; name="exists"

overwrite
--13eba0c1a6344d0ca6850a87303ced0f
Content-Disposition: form-data; name="file"; filename="10.jpg"
Content-Type: image/jpeg

<content>
--13eba0c1a6344d0ca6850a87303ced0f--

-------------------------
Conn body_params before Parser: %Plug.Conn.Unfetched{aspect: :body_params}
Conn body_params after Parser: %{}

根据我对multipart / form-data请求的格式的理解,这应该解析为包含“file”和“exists”键的映射。当我对基于插件的服务器发出真正的POST请求时,会正确解析请求,并且body_params包含带有预期密钥的映射。

这是一个形式错误的邮政体格式吗?这是Plug.Adapters.Test.Conn代码中的缺陷/限制吗?当我解析康恩时,我是否以微妙的方式做错了什么?

我可以通过直接传递mock'd预解析的Conn结构来测试这个接口,但我宁愿不这样做。

0 个答案:

没有答案