2015-11-23 13 views
14

Próbuję przetestować kontroler, który oczekuje przesłania pliku za pomocą frameworka phoenix. Poszedłem za przewodnikiem przy przewodnikach phoenix (http://www.phoenixframework.org/docs/file-uploads) i działa on w przeglądarce, ale mam problem z napisaniem testu na to. Oto co zrobiłem:Testowanie przesyłania pliku w phoenix/elixir

test "POST photo" do 
    { :ok, raw_file } = File.read "1528_27.jpg" 
    conn() |> post("/api/v1/originals", %{ :image => raw_file }) 
    # do some assertions 
end 

Problem jest, w sterowniku, mój plik nie kończy jako %Plug.Upload struktury, ale jako binarny. Więc podczas testowania moje params w wyglądzie kontrolera jak:

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, ...>>}, 

i mój kontroler wysadza podczas próby dostępu params["image"].path. To działa podczas przesyłania z przeglądarki jednak, bo wtedy mam oczekiwaną Upload struct w moim params:

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" 
    } 
}, 

Jak mogę post plik z testem, tak ja dostać %Plug.Upload struct, a nie tylko binarny ?

Odpowiedz

27

Umieść plik w katalogu testów gdzieś (może test/fixtures), a następnie użyć Plug.Upload struct:

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

że wydaje się dość oczywiste z perspektywy czasu;) thx! – srecnig

+2

@srecnig Rozwiązanie oczywiste jest prawdopodobnie dobrym znakiem! – Gazler

+2

Czy istnieje sposób sprawdzenia tego bez fizycznego odczytu z pliku urządzenia na dysku? Wolę, aby moje testy działały w pamięci, o ile to możliwe – pmarreck

Powiązane problemy