gpt4 book ai didi

unit-testing - ?assertException 实际上适用于 gen_fsm :startlink?

转载 作者:行者123 更新时间:2023-12-02 17:38:00 24 4
gpt4 key购买 nike

我在 gen_fsm 回调模块 (my_fsm) 中有以下 init 方法:

init(Args) when length(Args) =:= 2 ->
% do work with Args here
{ok, my_state, InitialState}.

回调模块中没有其他初始化方法。

我想使用 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_fsm进程中。当调用 init/1 函数时,gen_fsm 捕获结果。如果它看到类似错误的内容,它会将错误发送回父级(通过 proc_lib:init_ack/1-2),然后调用 exit(Error)。

因为您使用 start_link 并且没有捕获退出,所以您将永远不会收到返回值 - 您只会崩溃。对于您的测试用例,您需要使用 start 或调用 process_flag(trap_exit,true) 以获得返回值,而不是仅仅在其他进程时崩溃下降。

然后您需要从

切换
?assertException(exit, _, gen_fsm:start_link(my_fsm, [], [])).

类似

?assertMatch({error,{function_clause,[{my_fsm,init,_} | _]}}, 
gen_fsm:start_link(my_fsm, [], []))

为了让它运转良好。

关于unit-testing - ?assertException 实际上适用于 gen_fsm :startlink?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4050591/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com