Testing ExUnit没有断言/反驳,完全依赖于模式匹配?
我正在测试函数的返回值。这两种方法中哪一种是首选方法Testing ExUnit没有断言/反驳,完全依赖于模式匹配?,testing,elixir,ex-unit,Testing,Elixir,Ex Unit,我正在测试函数的返回值。这两种方法中哪一种是首选方法 test“额外详细,使用assert”do {:error,reason}=MyModule.my_-fun 断言原因==:否 结束 测试“仅使用模式匹配”do {:error,:nope}=MyModule.myu 结束 我喜欢第一个,因为我现在不喜欢,测试需要一个assert语句,运行测试时的错误消息更具描述性。另外,带有行号的MatchError也应该足够了。您可以使用assert和=来获得assert和更具描述性的错误消息,并且只需
test“额外详细,使用assert”do
{:error,reason}=MyModule.my_-fun
断言原因==:否
结束
测试“仅使用模式匹配”do
{:error,:nope}=MyModule.myu
结束
我喜欢第一个,因为我现在不喜欢,测试需要一个
assert
语句,运行测试时的错误消息更具描述性。另外,带有行号的MatchError
也应该足够了。您可以使用assert
和=
来获得assert
和更具描述性的错误消息,并且只需一行代码:
assert {:error, :nope} = MyModule.my_fun
与=
不同,您可以在LHS上使用任何模式,尽管在这种情况下,=
可以替换为=
,因为LHS既是有效模式又是有效值
失败时,您将得到一条错误消息,这比不使用断言进行模式匹配要好,例如
1) test the truth (MTest)
test/m_test.exs:10
match (=) failed
code: {:error, :nope} = MyModule.my_fun()
right: {:error, :nop}
stacktrace:
test/m_test.exs:11: (test)
对我来说,在匹配项上使用assert的主要缺点是,在测试结果中无法得到左右比较。这是
assert{:error,:nope}=MyModule.my_fun
真的在测试什么吗?如果模式匹配,它基本上会断言元组{:error,:nope}
是真的,不是吗?如果模式不匹配,仍然存在匹配错误
@carp nope,将不会有任何匹配错误
<代码>断言专门处理=
。我刚才在答案中添加了一个测试失败输出示例。@Stuart是的,如果LHS是一个有效值,我会使用=
获得漂亮的彩色差异,但如果它不是一个有效值,这比在测试中只做模式=值
要好。@Dogbert非常正确,我想当断言atom结果时,==
并不是真的需要。底线是始终使用断言:)