erlang - Assert_receive 来测试 Genserver 消息处理程序?
问题描述
我希望能够handle_info
在测试中捕获发送到我的 GenServer 的消息,以检查这些是我想要的。
1/有没有办法以某种方式打印每条通过的消息?2/ 使用assert_receive
有没有办法捕捉这些消息?我应该assert_receive
在调用将导致handle_info
触发器的外部服务之前还是之后设置?我应该使用什么语法?
我尝试了许多组合,assert_receive
并receive do...
尝试显示消息进入,但没有成功。
解决方案
两者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。
推荐阅读
- python - 在 Catalina 下添加访问外部 HD 的读/写权限
- python - 将数据写入 csv 文件时出错,ValueError: I/O operation on closed file
- javascript - 通过 JSON 构建条件问题和答案
- c - ++letter[c - 'A']; 是什么意思?在这个C程序中是什么意思?
- python - Python Pandas:从数据框中的值形成矩阵(二维数组)(忽略 NaN 值)
- azure - 从 Azure k8s 外部访问 Web 应用
- git - 为什么 GitVersion Semver 补丁号会自动偏移?
- web-scraping - 网页抓取某些网站不起作用
- three.js - 我的浏览器中的这个标记是什么……是 gltf 吗?
- flutter - Flutter & Provider 自动登录