Unit testing assertException是否实际与gen_fsm:startlink一起工作?
我在gen_fsm回调模块(my_fsm)中有以下init方法: 回调模块中没有其他init方法 我想使用eunit编写一个单元测试,其中我断言使用不包含两个元素的参数列表调用gen_fsm失败:Unit testing assertException是否实际与gen_fsm:startlink一起工作?,unit-testing,erlang,Unit Testing,Erlang,我在gen_fsm回调模块(my_fsm)中有以下init方法: 回调模块中没有其他init方法 我想使用eunit编写一个单元测试,其中我断言使用不包含两个元素的参数列表调用gen_fsm失败: start_link_without_args_exits_test() -> ?assertException(exit, _, gen_fsm:start_link(my_fsm, [], [])). 但是,当测试运行时,eunit将跳过测试,并显示以下消息: undefined *
start_link_without_args_exits_test() ->
?assertException(exit, _, gen_fsm:start_link(my_fsm, [], [])).
但是,当测试运行时,eunit将跳过测试,并显示以下消息:
undefined
*unexpected termination of test process*
::{function_clause,[{my_fsm,init,[[]]},
{gen_fsm,init_it,6},
{proc_lib,init_p_do_apply,3}]}{proc_lib,init_p_do_apply,3}]}
为什么测试没有“捕获”此错误并将其报告为通过测试?异常实际上发生在
gen\u fsm
过程中。调用init/1
函数时,gen_fsm
捕获结果。如果它看到类似错误的内容,它会将错误发送回父级(通过proc_lib:init_ack/1-2
),然后调用exit(error)
因为您使用的是start\u链接
,并且没有捕获退出,所以您永远不会收到返回值——您只会崩溃。对于您的测试用例,您需要使用start
或调用process\u标志(trap\u exit,true)
,以获得返回值,而不是在另一个进程停止时崩溃
然后你需要从
?assertException(exit, _, gen_fsm:start_link(my_fsm, [], [])).
差不多
?assertMatch({error,{function_clause,[{my_fsm,init,_} | _]}},
gen_fsm:start_link(my_fsm, [], []))
为了让它正常工作
?assertMatch({error,{function_clause,[{my_fsm,init,_} | _]}},
gen_fsm:start_link(my_fsm, [], []))