测试时导致问题的任务

时间:2017-11-07 20:29:05

标签: elixir otp supervisor

我目前有Supervisor监督某些Task。该任务负责异步发送电子邮件和更新数据库。我正在测试一个将启动这些任务的函数,尽管该任务与测试无关。

当我运行测试时,我看到在STDOUT中打印了Ecto.StaleEntryError。我相信这种情况正在发生,因为Ecto将在测试完成后但在任务运行之前删除记录。当它尝试更新记录时,它不存在,因此发生Ecto.StaleEntryError

作为旁注,测试不会失败。它只打印堆栈跟踪。

我不确定是否应该尝试阻止任务以某种方式执行或者是否有其他方法。

1 个答案:

答案 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文档获取灵感。