You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Elixir Phoenix测试出现Protocol.UndefinedError错误的解决方法

问题解决方案

错误原因

你在测试中调用post(conn, Routes.item_path(conn, :create_all, @create_attrs))时,错误地将请求参数作为路径参数传递给路由助手。@create_attrs中的details.amount是Float类型,而Phoenix的Phoenix.Param协议默认未为Float实现路径参数编码逻辑,导致报错。Postman测试正常是因为你在Postman中是将JSON放在请求体里发送,而非路径参数。

修复步骤

  • 修正POST请求参数传递方式:将请求体参数通过json: @create_attrs选项传入post/3,而非放在路由路径中。路由助手仅生成请求路径,不需要额外路径参数。
  • 添加认证头:获取token后需通过put_req_header将其加入请求头,否则会触发认证失败。
  • 验证路由定义:确保router.ex中create_all路由为POST类型且无路径参数,示例如下:
    post "/items/create_all", ItemController, :create_all
    

修正后的测试代码片段

describe "create_task:" do
  test "create task", %{conn: conn} do
    %{ token: [ token ] } = get_poster_token(conn)
    conn = conn
           |> put_req_header("authorization", token)
           |> post(Routes.item_path(conn, :create_all), json: @create_attrs)
    assert json_response(conn, 200)["status"] == 1
  end
end

内容的提问来源于stack exchange,提问作者sooon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 00:57:13