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().
,它可以收到回复。
谢谢。
答案 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,...}测试的合约。