Eunit测试不会等待接收

时间:2012-10-04 08:13:50

标签: erlang eunit

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().,它可以收到回复。

谢谢。

1 个答案:

答案 0 :(得分:2)

我的猜测是听力方面有问题,比如丢失{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,...}测试的合约。