2

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

4

2 回答 2

6

你可以使用sys:get_state/1which 与所有 gen 都很好。

于 2014-11-23T22:24:15.920 回答
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.

请参阅此处对这种方法的讨论 此外,如果您处理非常复杂的状态和状态转换,也许会发现您很有帮助

于 2014-11-24T06:19:24.207 回答