我正在做一个接收大量消息的通道测试。我可能在设置过程中收到一条消息,调整一些状态,然后我想要assert
(或refute
)发送该消息的另一个副本。我想我可以在触发第二个消息的事件之前清除邮箱。如何清除channelcase
邮箱?
编辑,我已经完成了assert_push
所有旧消息的需要,这将它们从邮箱中清除。这工作得很好,但如果有多个消息
实现此目的的简单方法是简单地接收%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
正在使用该超时。
只是澄清一下,如果有人像我一样对这个问题感到困惑。
通过通道发送的消息存储在测试进程邮箱中,因此为了清除消息,我们只需要清除进程的邮箱。因此,使用Mark上面发布的内容,我们可以刷新消息。
p。D:使用此:erlang.process_info(self(), :messages) |> IO.inspect()
,我们可以看到进程邮箱中的当前消息。
编辑::lib.flush_receive()
工作完美!不幸的是,这个模块似乎已经被弃用了,我找不到替代品。
我一直在寻找解决这个问题的方法。assert_push
对我来说不实用,因为有许多消息排队,与我的测试无关。您可以使用:c.flush()
来转储所有消息。不幸的是,我还不知道如何防止将其打印到控制台