在phoenix/elixir中测试文件上传

sre*_*nig 24 elixir phoenix-framework

我正在尝试测试希望使用phoenix框架上传文件的控制器.我按照凤凰指南(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
Run Code Online (Sandbox Code Playgroud)

问题是,在控制器中,我的文件永远不会以%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, ...>>},
Run Code Online (Sandbox Code Playgroud)

当我试图访问时,我的控制器会爆炸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"
  }
},
Run Code Online (Sandbox Code Playgroud)

我如何post从测试中获取文件,所以我得到一个%Plug.Upload结构,而不仅仅是二进制文件?

Gaz*_*ler 44

将文件放在某个地方(可能test/fixtures)的测试目录中,然后使用Plug.Upload结构:

upload = %Plug.Upload{path: "test/fixtures/example.png", filename: "example.png"}
conn() |> post("/api/v1/originals", %{ :image => upload })
Run Code Online (Sandbox Code Playgroud)

  • @srecnig明显的解决方案可能是一个好兆头! (2认同)
  • 有没有办法测试这个没有物理读取磁盘上的夹具文件?如果可能的话,我更喜欢我的测试在内存中运行 (2认同)
  • @Tanweer大概你会使用像`<input type ="file"name ="image []"multiple>`这样的东西.在这种情况下,您将在帖子中传递一个列表.`post("/ api/v1/originals",%{:image => [%Plug.Upload {},%Plug.Upload {}]})` (2认同)