7

我正在做一个接收大量消息的通道测试。我可能会在设置过程中收到一条消息,调整一些状态,然后我想assert(或refute)发送该消息的另一个副本。我想我可以通过在引发将触发第二条消息的事件之前清除邮箱来做到这一点。如何清空channelcase邮箱?

编辑,我已经通过assert_push所有旧邮件完成了我的需求,这将它们从邮箱中清除了。这工作得很好,但如果消息多于几条,就会非常不方便

4

3 回答 3

2

只是为了澄清是否有人喜欢我对这个问题感到很困惑。

通过通道发送的消息存储在测试进程邮箱中,因此为了清理消息,我们只需要清理进程的邮箱即可。因此,使用上面 Mark 发布的内容,我们可以刷新消息。

PD:使用这个 :erlang.process_info(self(), :messages) |> IO.inspect()我们可以看到进程邮箱中的当前消息。

于 2019-04-01T10:22:05.957 回答
1

实现此目的的一种简单方法是简单地接收%Phoenix.Socket.Message{}.

例如:

def flush_messages(timeout \\ 100) do
  receive do
    %Phoenix.Socket.Message{} ->
      flush_messages()
  after
    timeout -> nil
  end
end

那里允许待处理的timeout消息到达。100m 也是 的默认超时assert_receive,由assert_push.

于 2018-06-01T13:08:29.087 回答
1

编辑::lib.flush_receive()完美运行!不幸的是,该模块似乎已被弃用,我找不到替代品。

我一直在寻找解决这个问题的方法。assert_push对我来说不实用,因为有许多消息在排队并且与我的测试无关。您可以使用:c.flush()which 转储所有消息。不幸的是,我还不知道如何防止它打印到控制台。

于 2017-09-17T20:24:38.503 回答