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
相关产品推荐
相关产品推荐

