所以我使用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 请求?
它看起来就像你想在你得到一个元组时对地图进行编码一样。
你有:
{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
里面比你想象的要多。
还有一件事,请记住 keys::atoms!
重用现有的原子,即如果在调用之前没有分配:some_var
,你会遇到一个参数错误消息。
所以也许只是删除它可能会有所帮助:
Poison.Parser.parse!(resp.resp_body)