0

現在、ユーザーがチャネルに接続したときと、ユーザーがチャネルを離れたときを追跡する機能があります。これは、このスタックオーバーフローの回答 hereから実装されています。

コールバック ロジックを検証するために、次のテストを作成しました ( commit を参照)。

socket = subscribe_and_join!(socket, PostChannel, "post:#{post.id}")

assert (length Records.list_perceptions()) == 1
...
assert head.counter == 1

close(socket)
:timer.sleep(10) # Is this necessary?

assert (length Records.list_perceptions()) == 1
...
assert head.counter == 0

これを遅延なしでテストすると、モニター コールバックはトリガーされません。遅延を取り除くと、テスト アサーションが失敗し、テストの完了後に GenServer シャットダウン エラーが発生します。

00:48:10.496 [error] Task #PID<0.381.0> started from :post terminating
** (stop) exited in: GenServer.call(#PID<0.373.0>, {:checkout, #Reference<0.0.2.400>, true, 15000}, 5000)
    ** (EXIT) shutdown: "owner #PID<0.372.0> exited with: shutdown"
    (db_connection) lib/db_connection/ownership/proxy.ex:32: DBConnection.Ownership.Proxy.checkout/2
    (db_connection) lib/db_connection.ex:920: DBConnection.checkout/2
    (db_connection) lib/db_connection.ex:742: DBConnection.run/3
    (db_connection) lib/db_connection.ex:636: DBConnection.execute/4
    (ecto) lib/ecto/adapters/postgres/connection.ex:105: Ecto.Adapters.Postgres.Connection.execute/4
    (ecto) lib/ecto/adapters/sql.ex:243: Ecto.Adapters.SQL.sql_call/6
    (ecto) lib/ecto/adapters/sql.ex:441: Ecto.Adapters.SQL.execute_or_reset/7
    (ecto) lib/ecto/repo/queryable.ex:130: Ecto.Repo.Queryable.execute/5
    (ecto) lib/ecto/repo/queryable.ex:35: Ecto.Repo.Queryable.all/4
    (ecto) lib/ecto/repo/queryable.ex:76: Ecto.Repo.Queryable.one!/4
    (udia) lib/udia_web/channels/post_channel.ex:79: UdiaWeb.PostChannel.leave/2
    (elixir) lib/task/supervised.ex:85: Task.Supervised.do_apply/2
    (stdlib) proc_lib.erl:247: :proc_lib.init_p_do_apply/3
Function: #Function<0.28181301/0 in ChannelWatcher.handle_info/2>
    Args: []

テスト ケースに遅延を導入することなく、機能をきれいにテストする方法はありますか?

4

0 に答える 0