在 phoenix/elixir 中测试文件上传
Testing a file upload in phoenix/elixir
我正在尝试测试需要使用 phoenix 框架上传文件的控制器。我遵循了 phoenix guides (http://www.phoenixframework.org/docs/file-uploads) 上的指南,它在浏览器中工作,但我在为它编写测试时遇到了问题。这是我所做的:
test "POST photo" do
{ :ok, raw_file } = File.read "1528_27.jpg"
conn() |> post("/api/v1/originals", %{ :image => raw_file })
# do some assertions
end
问题是,在控制器中,我的文件永远不会以 %Plug.Upload
结构结束,而是以二进制形式结束。所以在测试时,我在控制器中的参数看起来像:
params: %{"image" => <<255, 216, 255, 225, 18, 180, 69, 120, 105, 102, 0, 0, 73, 73, 42, 0, 8, 0, 0, 0, 10, 0, 15, 1, 2, 0, 26, 0, 0, 0, 134, 0, 0, 0, 16, 1, 2, 0, 10, 0, ...>>},
我的控制器在尝试访问 params["image"].path
时崩溃了。这在从浏览器上传时有效,因为那时我的参数中有预期的上传结构:
params: %{
"image" => %Plug.Upload{
content_type: "image/jpeg",
filename: "1528_27.jpg",
path: "/var/folders/98/40k7dt2d2sxf6xnkc_627lqc0000gp/T//plug-1448/multipart-280987-612081-2"
}
},
如何 post
来自测试的文件,所以我得到一个 %Plug.Upload
结构,而不仅仅是二进制文件?
将文件放在测试目录中的某处(可能是 test/fixtures
),然后使用 Plug.Upload 结构:
upload = %Plug.Upload{path: "test/fixtures/example.png", filename: "example.png"}
conn() |> post("/api/v1/originals", %{ :image => upload })
我正在尝试测试需要使用 phoenix 框架上传文件的控制器。我遵循了 phoenix guides (http://www.phoenixframework.org/docs/file-uploads) 上的指南,它在浏览器中工作,但我在为它编写测试时遇到了问题。这是我所做的:
test "POST photo" do
{ :ok, raw_file } = File.read "1528_27.jpg"
conn() |> post("/api/v1/originals", %{ :image => raw_file })
# do some assertions
end
问题是,在控制器中,我的文件永远不会以 %Plug.Upload
结构结束,而是以二进制形式结束。所以在测试时,我在控制器中的参数看起来像:
params: %{"image" => <<255, 216, 255, 225, 18, 180, 69, 120, 105, 102, 0, 0, 73, 73, 42, 0, 8, 0, 0, 0, 10, 0, 15, 1, 2, 0, 26, 0, 0, 0, 134, 0, 0, 0, 16, 1, 2, 0, 10, 0, ...>>},
我的控制器在尝试访问 params["image"].path
时崩溃了。这在从浏览器上传时有效,因为那时我的参数中有预期的上传结构:
params: %{
"image" => %Plug.Upload{
content_type: "image/jpeg",
filename: "1528_27.jpg",
path: "/var/folders/98/40k7dt2d2sxf6xnkc_627lqc0000gp/T//plug-1448/multipart-280987-612081-2"
}
},
如何 post
来自测试的文件,所以我得到一个 %Plug.Upload
结构,而不仅仅是二进制文件?
将文件放在测试目录中的某处(可能是 test/fixtures
),然后使用 Plug.Upload 结构:
upload = %Plug.Upload{path: "test/fixtures/example.png", filename: "example.png"}
conn() |> post("/api/v1/originals", %{ :image => upload })