2012-10-04 44 views
0

Eunit不会等待接收,有没有什么特别的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().,可以收到回复。

谢谢。

回答

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,...}测试的契约。

+0

谢谢,我要模拟一个tcp服务器。当配置设置装置时,有没有一种从应用程序的术语'env'中读取数据的好方法?否则,我必须在我的测试中对其进行硬编码。 – goofansu