GenServer异步集成测试

时间:2016-09-29 13:40:41

标签: elixir

尝试使用elixir学习基本代码测试,并且无法绕过测试异步函数(genserver的handle_info和cast)。

一种有效但有问题的方法是在投射异步函数后使用:timer.sleep(x)

例如,假设handle_cast处理来自状态的项目列表,并将调用调度到另一个将从外部API获取数据的模块,完成后它会将消息(api数据)发送回同一个genserver。

测试这个的最佳方法是什么?我可以在测试中监控genserver消息/邮箱吗?

修改 另一个例子,比如在init中我这样做是为了从db获取初始状态:

Process.send_after(self(), :started, 0)

并且:开始看起来像:

defhandleinfo :started, state: state, do: new_state(UserServerStarted.get_data(state))

我还有其他选择:timer.sleep来检查UserServerStarted是否返回了正确的内容?我知道我可以单独测试该模块/单元,但我想进行完全集成测试。

以下是我现在的表现:

... SETUP - Supervisor start UserServer...

  test "spin up server and inital tree after user registers", %
   {user: user} do
    :timer.sleep(500)
    assert %{"default" => [nil]} == GenServer.call(UserServer.via_tuple(user.id), :get)
  end

1 个答案:

答案 0 :(得分:2)

我最近遇到了类似的问题。我设法通过注册我想在测试中跟踪的过程来解决这个问题:

coord_polar

在你的测试中:

defmodule Foo
  def bar do
    pid = spawn fn -> consume(channel, tag, payload) end
    if !Process.whereis(:worker) do
      Process.register(pid, :worker)
    end
  end
end