Тест Eunit не будет ждать получения

Юнит не будет ждать получения, есть что-то особенное для Юнит.

-module (test_account).

-include_lib ("eunit/include/eunit.hrl").

-compile (export_all).

login_test() ->
    {ok, Socket} = gen_tcp:connect("localhost", 5678,
        [binary, {packet, 4}]),

    RoleName = <<"abc">>,
    LenRoleName = byte_size(RoleName),

    Password = <<"def">>,
    LenPassword = byte_size(Password),

    LoginBin = <<11001:16, LenRoleName:16, RoleName/binary,
        LenPassword:16, Password/binary>>,
    gen_tcp:send(Socket, LoginBin),
    print(Socket).


print(Socket) ->
    receive
        {tcp, Socket, Data} ->
            io:format("Data=~p~n", [Data])
    end.

Если я вызову test_account:login_test(). напрямую, он может получить ответ.

Спасибо.


person Yejun Su    schedule 04.10.2012    source источник


Ответы (1)


Я предполагаю, что на стороне прослушивания что-то не так, например, отсутствует параметр {packet, 4} или что-то в этом роде. Я вручную запустил прослушивающий сокет на требуемом порту, и тест сработал.

EUnit на самом деле не предназначен для запуска интеграционных тестов «из коробки» (хотя есть некоторые библиотеки, которые также делают его несколько удобным для интеграционных тестов). То, что вы действительно должны делать здесь, выглядит примерно так:

main_test_() ->
    {setup,
        fun setup/0,
        fun teardown/1,
        [{"login", fun login_test/0}]
    }.

setup() ->
    process_flag(trap_exit, true),
    {ok, Pid} = my_tcp_server:start_link(),
    Pid.

teardown(Pid) ->
    exit(Pid, shutdown).

Таким образом, вы не должны полагаться на отдельно работающий сервер при использовании только EUnit. Вместо этого вы должны либо запустить его явно из своего кода, либо, если он внешний, смоделировать его (или только некоторые его части, если весь код сервера сложен).

P.S. Не забудьте знак подчеркивания в конце main_test_, это контракт для тестов {setup, ...} и {foreach, ...}.

person demeshchuk    schedule 04.10.2012
comment
Спасибо, я собираюсь издеваться над TCP-сервером. Есть ли хороший способ прочитать данные из термина приложения env при настройке конфигурации? В противном случае я должен жестко запрограммировать его в своем тесте. - person Yejun Su; 04.10.2012