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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:18:21