首页 > 解决方案 > Assert_receive 来测试 Genserver 消息处理程序?

问题描述

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

1/有没有办法以某种方式打印每条通过的消息?2/ 使用assert_receive有没有办法捕捉这些消息?我应该assert_receive在调用将导致handle_info触发器的外部服务之前还是之后设置?我应该使用什么语法?

我尝试了许多组合,assert_receivereceive do...尝试显示消息进入,但没有成功。

标签: erlangelixirintegration-testinggen-server

解决方案


两者ExUnit.Assertions.assert_receive/3ExUnit.Assertions.assert_received/2断言消息进入当前进程的邮箱。前者将在消息实际发送之前或之后调用:

断言在指定pattern的时间段内已经或将要收到匹配的消息timeout,以毫秒为单位。

后者将在以下时间调用

断言已接收到与模式匹配的消息并且在当前进程的邮箱中。

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

一般来说,您应该测试您的代码,而不是 OTP。


推荐阅读