2017-07-17 10 views
1

Plug.Test.connを使用すると、リクエストボディの設定が機能していないようです。 Plug.Testを使用してElixir PlugテストでPOSTリクエストのボディをどのように設定しますか?

$ curl -X POST -d foo=bar http://localhost:4000/ 
body: foo=bar 

curlを使用して

defmodule MyPlug do 
    import Plug.Conn 

    def init(_), do: nil 

    def call(conn, _) do 
    {:ok, body, _conn} = read_body(conn) 
    send_resp(conn, 200, "body: #{body}") 
    end 
end 

defmodule MyTest do 
    use ExUnit.Case, async: false 
    use Plug.Test 

    test "POST request" do 
    conn = conn(:post, "/", %{foo: "bar"}) 
      |> MyPlug.call(%{}) 
    assert conn.resp_body == "body: foo=bar" 
    end 
end 

失敗:

1) test POST request (MyPlugTest) 
    test/my_plug_test.exs:28 
    Assertion with == failed 
    code: conn.resp_body() == "body: foo=bar" 
    left: "body: " 
    right: "body: foo=bar" 
ここ

は、プラグインです

また、文字列を渡して、docsのようにcontent-typeヘッダーを設定しようとしました。 connに渡す前に、バイナリに体を変換する

答えて

3

使用Poison.encode!

defmodule MyPlug do 
    import Plug.Conn 

    def init(_), do: nil 

    def call(conn, _) do 
    {:ok, body, _conn} = read_body(conn) 
    send_resp(conn, 200, "body: #{body}") 
    end 
end 

defmodule MyTest do 
    use ExUnit.Case 
    use Plug.Test 

    test "POST request" do 
    conn = conn(:post, "/", Poison.encode!(%{foo: "bar"})) 
      |> MyPlug.call(%{}) 
    assert conn.resp_body == ~S(body: {"foo":"bar"}) 
    end 
end 

しかしPlug.Conn.read_bodyは、それがデータを破棄した後ことを、一度使用することができます。ですから、以前のパイプラインで体を解析するPlug.Parsersを使用することもできます。解析した後

plug Plug.Parsers, 
    parsers: [:urlencoded, :multipart, :json], 
    pass: ["*/*"], 
    json_decoder: Poison 

を、体がconn.body_paramsのように利用可能であり、conn.paramsにマージ。

関連する問題