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 に答える