【问题标题】:How to set the body of a PUT request in Elixir/phoenix with Plug.Adapters.Test.Con如何使用 Plug.Adapters.Test.Con 在 Elixir/phoenix 中设置 PUT 请求的主体
【发布时间】:2018-01-30 02:55:54
【问题描述】:

所以我使用 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 请求?

【问题讨论】:

  • 这是整个错误信息吗?奇怪的是,您的测试代码的堆栈跟踪中没有一行。

标签: elixir phoenix-framework


【解决方案1】:

在我看来,当你有一个元组时,你想对 map 进行编码。

你有:

{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,您将遇到参数错误消息。

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

Poison.Parser.parse!(resp.resp_body)

【讨论】:

  • 问题中的错误是Poison.EncodeError。我认为Poison.Parser.parse! 不会发出该错误。
  • 感谢您的帮助,根本原因是我试图解析的响应中有一个 Ecto.Schema.Struct。
猜你喜欢
  • 1970-01-01
  • 2022-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多