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

在ExUnit中无法断言SyntaxError的技术问题求助

解决ExUnit中断言SyntaxError的问题

我明白你在测试自定义抛出的SyntaxError时遇到了麻烦,别担心,这是ExUnit里很常见的场景,用对方法就能轻松搞定!

首先要明确:你在代码里手动raise SyntaxError属于运行时异常,ExUnit专门提供了assert_raise宏来断言这类异常的抛出。

正确的测试写法

针对你的BracketParser模块,测试触发SyntaxError的场景可以这么写:

defmodule BracketParserTest do
  use ExUnit.Case
  doctest BracketParser

  test "raises SyntaxError when line ends with unclosed bracket" do
    # 用assert_raise捕获指定类型的异常
    assert_raise SyntaxError, fn ->
      BracketParser.parse_line("{")
    end

    # 如果需要断言异常的具体提示消息,可以加上第三个参数
    # assert_raise SyntaxError, "Unclosed bracket found", fn ->
    #   BracketParser.parse_line("{")
    # end
  end
end

可能踩的坑

  1. 确保触发异常的路径正确:你需要传入能走到parse_line_as_list([], true, _acc)分支的输入(比如示例里的"{")),这样才会触发raise逻辑。
  2. 区分编译时和运行时SyntaxError:Elixir原生的SyntaxError大多是编译阶段抛出的(比如语法写错),但你这里是手动在运行时抛出的,所以assert_raise完全可以捕获到,别和编译时异常混淆。
  3. 检查代码完整性:你提供的代码最后一行parse_li...是截断状态,要确保实际代码里这个分支是完整的,不然可能影响测试路径的执行。

快速验证方法

如果不确定代码是否真的会抛出异常,可以先在IEx里手动调用测试输入:

iex> BracketParser.parse_line("{")
hello
** (SyntaxError) nofile:0: syntax error

如果能看到上述错误输出,说明你的代码逻辑是正常的,只需要在测试里用assert_raise捕获即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:15:56