如何使用Plug.Adapters.Test.Con在Elixir / phoenix中设置PUT请求的主体

时间:2017-08-22 00:15:15

标签: elixir phoenix-framework

所以我使用Elixir / Phoenix和ESpec测试框架进行如下测试设置:

let :response do
  resp = build_conn() |> put("/kites/#{id_function()}", [horizontal: "more", default: true])
  Poison.Parser.parse!(resp.resp_body, keys: :atoms!)
end

当我调用response()时,我收到一个错误,例如:

** (Poison.EncodeError) unable to encode value: {Plug.Adapters.Test.Conn, %{chunks: nil, method: "PUT", owner: #PID<0.46.0>, params: nil, ref: #Reference<0.0.5.1528>, req_body: ""}}
      (poison) lib/poison/encoder.ex:354: Poison.Encoder.Any.encode/2
      (poison) lib/poison/encoder.ex:213: anonymous fn/4 in Poison.Encoder.Map.encode/3
      (poison) lib/poison/encoder.ex:214: Poison.Encoder.Map."-encode/3-lists^foldl/2-0-"/3
      (poison) lib/poison/encoder.ex:214: Poison.Encoder.Map.encode/3
      (poison) lib/poison/encoder.ex:213: anonymous fn/4 in Poison.Encoder.Map.encode/3
      (poison) lib/poison/encoder.ex:214: Poison.Encoder.Map."-encode/3-lists^foldl/2-0-"/3
      (poison) lib/poison/encoder.ex:214: Poison.Encoder.Map.encode/3
      (poison) lib/poison/encoder.ex:213: anonymous fn/4 in Poison.Encoder.Map.encode/3


1 examples, 1 failures

Finished in 1.0 seconds (0.76s on load, 0.24s on specs)

发生了什么事?我是否正确地将参数传递给PUT请求?

1 个答案:

答案 0 :(得分:1)

它代表我喜欢你想要在你有一个元组时对地图进行编码。

你有:

{Plug.Adapters.Test.Conn, %{chunks: nil, method: "PUT", owner: #PID<0.46.0>, params: nil, ref: #Reference<0.0.5.1528>, req_body: ""}}

包含{some_val, %{}的元组,其中%{}是地图。您可能只想对地图进行编码,因此它是第二个元素。您可以使用:elem(resp.resp_body, 1)

从元组中获取第二个元素

也许它会起作用:

Poison.Parser.parse!(elem(resp.resp_body, 1), keys: :atoms!)

或者只需用以下内容创建地图:

Enum.into(resp.resp_body, %{})

我不确定我是否指向正确的位置,但似乎resp.resp_body内部的数量超出预期。

还有一件事,请记住密钥::atoms!重用现有原子,即如果在调用之前未分配:some_var,则会遇到参数错误消息。 < / p>

所以也许只是删除它可能会有所帮助:

Poison.Parser.parse!(resp.resp_body)