首页 > 解决方案 > 如何测试 msg 是否发送到 GenServer 进程

问题描述

我将 GenServer 作为后台作业运行,每个作业interval都由Process.send_after(self(), :work, @interval).

该作业由主管在应用程序启动时启动。

它运行良好,但现在我想测试我的 GenServer 模块是否真的在每个interval.

我该如何测试它?

编辑

我发现它:sys.get_status(pid)可以用来获取一些关于进程的数据,但我真的很想使用类似的东西receive do ... end

编辑 2

handle_info/2功能:

@impl true
def handle_info(:work, state) do
  do_smt()

  schedule_worker()

  {:noreply, state}
end

schedule_worker/0功能:

defp schedule_worker do
  Process.send_after(self(), :work, @interval)
end

标签: erlangelixir

解决方案


您的消息中缺少某些内容。从您发布的内容中,我们可以了解到每@interval毫秒:work都会发送一条消息。您没有告诉我们handle_info/2发送消息时应该做什么。

一旦定义了这一点,您绝对可以编写一个测试来断言已通过使用assert_received断言接收到消息。


推荐阅读