web-dev-qa-db-ja.com

phoenix / elixirでのファイルアップロードのテスト

フェニックスフレームワークを使用してファイルのアップロードを期待するコントローラーをテストしようとしています。フェニックスガイド( 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にアクセスしようとすると、コントローラーが爆発します。ただし、これはブラウザからアップロードするときに機能します。これは、パラメータに期待されるUpload構造体があるためです。

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構造体を取得するにはどうすればよいですか?

24
srecnig

テストディレクトリのどこかにファイルを置きます(多分test/fixtures)次に、 Plug.Upload 構造体を使用します。

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