Assert_receive测试Genserver消息处理程序?

时间:2019-04-16 14:22:16

标签: erlang elixir integration-testing gen-server

我希望能够在测试中捕获发往GenServer handle_info的消息,以检查这些消息是否是我想要的。

1 /是否有一种方法可以打印出每条通过的消息? 2 /使用assert_receive是否可以捕获那些消息?我应该在对外部服务的调用之前或之后设置assert_receive,这将导致handle_info触发吗?我应该使用什么语法?

我尝试了assert_receive的许多组合,并且尝试了receive do...来尝试显示进入的消息,但没有成功。

1 个答案:

答案 0 :(得分:1)

ExUnit.Assertions.assert_receive/3ExUnit.Assertions.assert_received/2均断言进入当前进程的邮箱的消息。在邮件实际发送之前或之后,将前者称为

  

声明在pattern周期内已收到或将要收到与timeout相匹配的消息,以毫秒为单位。

后者在之后称为

  

声明已收到消息匹配模式,该消息位于当前进程的邮箱中。

也就是说,两者都不太适合测试现有的GenServer。消息将到达GenServer的消息框中,该功能由OTP提供,您不应对其进行测试。如果您需要记录消息,请将对Logger.log/3的调用添加到handle_info/2并检查日志实际上是与ExUnit.CaptureLog.capture_log/2一起发生的。如果消息到达后执行了某些操作,请测试此操作。

通常,您应该测试代码,而不是OTP。