現在、ユーザーがチャネルに接続したときと、ユーザーがチャネルを離れたときを追跡する機能があります。これは、このスタックオーバーフローの回答 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: []
テスト ケースに遅延を導入することなく、機能をきれいにテストする方法はありますか?