Тестирование загрузки файла в 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
struct, а как двоичный. Поэтому при тестировании мои параметры в контроллере выглядят следующим образом:
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
, а не только двоичную?
Ответы
Ответ 1
Поместите файл в тестовый каталог где-нибудь (возможно, test/fixtures
), затем используйте Plug.Upload struct:
upload = %Plug.Upload{path: "test/fixtures/example.png", filename: "example.png"}
conn() |> post("/api/v1/originals", %{ :image => upload })