在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
可能踩的坑
- 确保触发异常的路径正确:你需要传入能走到
parse_line_as_list([], true, _acc)分支的输入(比如示例里的"{")),这样才会触发raise逻辑。 - 区分编译时和运行时SyntaxError:Elixir原生的SyntaxError大多是编译阶段抛出的(比如语法写错),但你这里是手动在运行时抛出的,所以
assert_raise完全可以捕获到,别和编译时异常混淆。 - 检查代码完整性:你提供的代码最后一行
parse_li...是截断状态,要确保实际代码里这个分支是完整的,不然可能影响测试路径的执行。
快速验证方法
如果不确定代码是否真的会抛出异常,可以先在IEx里手动调用测试输入:
iex> BracketParser.parse_line("{") hello ** (SyntaxError) nofile:0: syntax error
如果能看到上述错误输出,说明你的代码逻辑是正常的,只需要在测试里用assert_raise捕获即可。
内容的提问来源于stack exchange,提问作者dopatraman
相关产品推荐
相关产品推荐

