Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir 无法在ExUnit中断言SyntaxError_Elixir_Ex Unit - Fatal编程技术网

Elixir 无法在ExUnit中断言SyntaxError

Elixir 无法在ExUnit中断言SyntaxError,elixir,ex-unit,Elixir,Ex Unit,以下是我正在测试的代码: defmodule BracketParser do @spec parse_line(binary) :: binary def parse_line(line), do: parse_line_as_list(String.graphemes(line), false, []) defp parse_line_as_list([], true, _acc) do IO.puts("hello") raise S

以下是我正在测试的代码:

defmodule BracketParser do
    @spec parse_line(binary) :: binary
    def parse_line(line), do: parse_line_as_list(String.graphemes(line), false, [])
    defp parse_line_as_list([], true, _acc) do
        IO.puts("hello")
        raise SyntaxError
    end
    defp parse_line_as_list([], _collect, acc) do
        Enum.reverse(acc) |> IO.iodata_to_binary
    end
    defp parse_line_as_list(["{" | t], _collect, acc) do
        parse_line_as_list(t, true, acc)
    end
    defp parse_line_as_list(["}" | t], _collect, acc) do
        parse_line_as_list(t, false, acc)
    end
    defp parse_line_as_list([h | t], true, acc) do
        parse_line_as_list(t, true, [h | acc])
    end
    defp parse_line_as_list([_h | t], collect, acc) do
        parse_line_as_list(t, collect, acc)
    end
end
这是我的测试:

ExUnit.start

defmodule TestBracketParser do
    use ExUnit.Case

    test "should get the text inside a pair of brackets" do
        assert_raise SyntaxError, fn() -> BracketParser.parse_line("{bill") end
    end
end
目标是拥有一个解析器,用于收集
{}
符号之间的文本。如果列表为空且集合标志设置为true,我希望代码会引发语法错误。但是,当我运行此代码时,我会得到以下结果:

  1) test should get the text inside a pair of brackets (TestBracketParser)
     test_parse_brackets.exs:6
     Got exception SyntaxError but it failed to produce a message with:

     ** (FunctionClauseError) no function clause matching in IO.chardata_to_string/1
         (elixir) lib/io.ex:461: IO.chardata_to_string(nil)
         (elixir) lib/path.ex:312: Path.relative_to/2
         (elixir) lib/exception.ex:713: SyntaxError.message/1
         (ex_unit) lib/ex_unit/assertions.ex:658: ExUnit.Assertions.check_error_message/2
         (ex_unit) lib/ex_unit/assertions.ex:639: ExUnit.Assertions.assert_raise/2
         test_parse_brackets.exs:10: TestBracketParser."test should get the text inside a pair of brackets"/1
         (ex_unit) lib/ex_unit/runner.ex:306: ExUnit.Runner.exec_test/1
         (stdlib) timer.erl:166: :timer.tc/1
         (ex_unit) lib/ex_unit/runner.ex:245: anonymous fn/4 in ExUnit.Runner.spawn_test/3
我不知道为什么会抛出
函数clauseError
。我似乎已经解释了所有的模式。我做错了什么?

作为各州的文件

如果
msg
是一个atom,它只调用atom作为第一个参数,[]作为第二个参数

raise/2
将对参数调用
exception/1
函数

在您的情况下,您应该使用
raise“SyntaxError”
,或者提供一个名为
SyntaxError
的模块来调用