Elixir项目测试报错:找不到get/2函数,问题排查求助
解决ExUnit测试中找不到get/2函数的问题
这个问题其实很常见,核心原因是**get/2并不是ExUnit自带的函数**,它是Phoenix框架的Phoenix.ConnTest模块提供的用于模拟HTTP请求的工具函数。
你大概率是在修改测试文件时,移除了Phoenix测试套件的引入,导致这些工具函数无法被调用。下面分两种情况给出解决方案:
情况1:你只是想正常测试Phoenix控制器(推荐)
Phoenix生成的控制器测试默认会使用项目自定义的ConnCase模块(比如MyAppWeb.ConnCase),这个模块已经帮你整合了ExUnit.Case和Phoenix.ConnTest,并初始化了测试所需的连接对象。
如果你不小心把测试文件改成了只依赖纯ExUnit:
# ❌ 错误写法:缺少Phoenix测试模块引入 defmodule MyAppWeb.PageControllerTest do use ExUnit.Case test "GET /" do conn = get(conn, "/") # 这里会提示找不到get/2 # ... end end
只需要改回使用项目的ConnCase即可:
# ✅ 正确写法:保留Phoenix测试环境 defmodule MyAppWeb.PageControllerTest do use MyAppWeb.ConnCase # 这个模块包含了ExUnit.Case和Phoenix.ConnTest test "GET /", %{conn: conn} do conn = get(conn, "/") assert html_response(conn, 200) =~ "Welcome to Phoenix!" end end
情况2:你确实想写纯ExUnit测试(不推荐控制器测试用这种方式)
如果非要脱离Phoenix的测试套件,那你需要自己构造连接对象,并直接调用控制器的动作函数,而不是用get/2。比如:
defmodule MyAppWeb.PageControllerTest do use ExUnit.Case alias MyAppWeb.PageController alias Plug.Conn test "index action works" do # 手动构造连接对象 conn = Conn.build(:get, "/", %{}) |> MyAppWeb.Endpoint.call([]) # 直接调用控制器的index函数 conn = PageController.index(conn, %{}) assert conn.status == 200 assert conn.resp_body =~ "Welcome to Phoenix!" end end
不过这种方式跳过了Phoenix的路由、中间件等完整流程,测试的场景和真实HTTP请求有差异,所以一般不建议用于控制器测试。
内容的提问来源于stack exchange,提问作者Errol Hassall
相关产品推荐
相关产品推荐

