0

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().直接调用,它可以收到响应。

谢谢你。

4

1 回答 1

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 时,您不应该依赖单独运行的服务器。相反,您应该从您的代码中显式启动它,或者,如果它是外部的,则模拟它(或者如果整个服务器代码很复杂,则只模拟它的某些部分)。

PS 不要忘记 'main_test_' 末尾的下划线,它是 {setup, ...} 和 {foreach, ...} 测试的合同。

于 2012-10-04T11:28:31.417 回答