如何使用eunit测试gen_server内部状态

时间:2014-11-23 22:11:31

标签: erlang gen-server eunit

在调用回调函数后,是否可以检查gen_server的内部状态?我不想在这里更改我的服务器的API。

2 个答案:

答案 0 :(得分:6)

你可以使用sys:get_state/1,它可以很好地适用于所有gen。

答案 1 :(得分:1)

也许,你会发现有用的另一种单元测试gen_servers的方法。 您可以直接测试gen_server回调,然后检查其状态转换,而不是运行gen_server进程并测试其行为。

例如:

-module(foo_server).

%% Some code skipped

handle_call({do_stuf, Arg}, _From, State) ->
    NewState = modify_state(
    {reply, {stuf_done, Arg}, NewState}.

%% Some code skipped 

-ifdef(TEST)

do_stuf_test_() ->
    {setup,
        fun() ->
            {ok, InitState} = foo_server:init(SomeInitParams),
            InitState
        end,
        fun(State) ->
            ok = foo_server:terminate(shutdown, State)
        end,
        fun(State) ->
            Result = foo_server:handle_call({do_stuf, hello}, undefined, State),
            [
                ?_assertMatch({reply, {stuf_done, hello}, _}, Result)
            ]
        end
    }
}.

-endif.

见这种方法的讨论here 此外,如果您处理复杂状态和状态转换,可能会发现proper有帮助。