我希望能够在测试中捕获发往GenServer handle_info
的消息,以检查这些消息是否是我想要的。
1 /是否有一种方法可以打印出每条通过的消息?
2 /使用assert_receive
是否可以捕获那些消息?我应该在对外部服务的调用之前或之后设置assert_receive
,这将导致handle_info
触发吗?我应该使用什么语法?
我尝试了assert_receive
的许多组合,并且尝试了receive do...
来尝试显示进入的消息,但没有成功。
答案 0 :(得分:1)
ExUnit.Assertions.assert_receive/3
和ExUnit.Assertions.assert_received/2
均断言进入当前进程的邮箱的消息。在邮件实际发送之前或之后,将前者称为:
声明在
pattern
周期内已收到或将要收到与timeout
相匹配的消息,以毫秒为单位。
后者在之后称为 :
声明已收到消息匹配模式,该消息位于当前进程的邮箱中。
也就是说,两者都不太适合测试现有的GenServer
。消息将到达GenServer
的消息框中,该功能由OTP提供,您不应对其进行测试。如果您需要记录消息,请将对Logger.log/3
的调用添加到handle_info/2
并检查日志实际上是与ExUnit.CaptureLog.capture_log/2
一起发生的。如果消息到达后执行了某些操作,请测试此操作。
通常,您应该测试代码,而不是OTP。