尝试使用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
答案 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