Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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
Unit testing assertException是否实际与gen_fsm:startlink一起工作?_Unit Testing_Erlang - Fatal编程技术网

Unit testing assertException是否实际与gen_fsm:startlink一起工作?

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 *

我在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
*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, [], []))