【问题标题】:Testing a file upload in phoenix/elixir在 phoenix/elixir 中测试文件上传
【发布时间】:2016-02-25 14:18:04
【问题描述】:

我正在尝试使用 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 结构,而不仅仅是二进制?

【问题讨论】:

标签: elixir phoenix-framework


【解决方案1】:

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

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

【讨论】:

  • 有什么方法可以在不从磁盘上的固定文件中物理读取的情况下进行测试?如果可能的话,我更喜欢我的测试在内存中运行
  • @Gazler 如何测试多个上传? Plug.Upload 一次只支持一个文件
  • @Tanweer 大概你会使用类似&lt;input type="file" name="image[]" multiple&gt; 的东西。在这种情况下,您将在帖子中传递一个列表。 post("/api/v1/originals", %{ :image =&gt; [%Plug.Upload{}, %Plug.Upload{}] })
  • 请注意,您可能还想在%Plug.Upload 结构中指定content-type 字段,该字段通常存在于通过用户界面上传的文件中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多