【问题标题】:Eunit test won't wait for receiveEunit 测试不会等待接收
【发布时间】:2012-10-04 19:28:31
【问题描述】:

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

谢谢。

【问题讨论】:

    标签: erlang eunit


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

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

    【讨论】:

    • 谢谢,我要模拟一个 tcp 服务器。配置设置夹具时,是否有一种从应用程序术语 env 读取数据的好方法?否则,我必须在测试中对其进行硬编码。
    猜你喜欢
    • 2023-04-03
    • 1970-01-01
    • 2012-04-06
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    • 2014-05-21
    • 2012-02-28
    • 1970-01-01
    相关资源
    最近更新 更多