Как проверить внутреннее состояние gen_server с помощью eunit

Можно ли проверить внутреннее состояние gen_server после вызова функции обратного вызова? Я бы предпочел не менять здесь API своего сервера.


person Rich Ashworth    schedule 23.11.2014    source источник


Ответы (2)


Вы можете использовать sys:get_state/1, который хорошо работает со всеми поколениями.

person mpm    schedule 23.11.2014

Возможно, вам пригодился бы другой подход к модульному тестированию 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.

См. обсуждение этого подхода здесь. сложные состояния и переходы между состояниями, возможно, вы окажетесь правильным полезным.

person Viacheslav Kovalev    schedule 24.11.2014