我目前有Supervisor
监督某些Task
。该任务负责异步发送电子邮件和更新数据库。我正在测试一个将启动这些任务的函数,尽管该任务与测试无关。
当我运行测试时,我看到在STDOUT中打印了Ecto.StaleEntryError
。我相信这种情况正在发生,因为Ecto将在测试完成后但在任务运行之前删除记录。当它尝试更新记录时,它不存在,因此发生Ecto.StaleEntryError
。
作为旁注,测试不会失败。它只打印堆栈跟踪。
我不确定是否应该尝试阻止任务以某种方式执行或者是否有其他方法。
答案 0 :(得分:2)
这是explicit contract
的完美用例。
让您的Supervisor
使用不同的Task
实现,请阅读config:
@task Application.get_env(:my_app, :task_impl)
并执行@task.async
而不是Task.async
。另外,让config/proc.exs
声明正确的实现:
config :my_app, :task_impl, Task
和test.exs
使用TaskStub
模块
config :my_app, :task_impl, TaskStub
TaskStub
可能如下所示:
defmodule TaskStub do
def async(_), do: :ok
end
还可以参考Mox
文档获取灵感。