测试时导致问题的任务
Task causing issues while testing
我目前有一个 Supervisor
负责监督一些 Task
。该任务负责异步发送电子邮件和更新数据库。我正在测试一个将启动这些任务的函数,尽管该任务与测试无关。
当我 运行 测试时,我看到 Ecto.StaleEntryError
打印在 STDOUT 中。我相信这种情况正在发生,因为 Ecto 将在测试完成后但任务 运行 之前删除记录。当它尝试更新不存在的记录时,会出现 Ecto.StaleEntryError
。
附带说明一下,测试没有失败。它只打印堆栈跟踪。
我不确定我是否应该尝试阻止任务以某种方式执行,或者是否有其他方法。
这是 explicit contract
的完美用例。
使您的 Supervisor
使用不同的 Task
实现,从配置中读取:
@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
文档以获取灵感。
我目前有一个 Supervisor
负责监督一些 Task
。该任务负责异步发送电子邮件和更新数据库。我正在测试一个将启动这些任务的函数,尽管该任务与测试无关。
当我 运行 测试时,我看到 Ecto.StaleEntryError
打印在 STDOUT 中。我相信这种情况正在发生,因为 Ecto 将在测试完成后但任务 运行 之前删除记录。当它尝试更新不存在的记录时,会出现 Ecto.StaleEntryError
。
附带说明一下,测试没有失败。它只打印堆栈跟踪。
我不确定我是否应该尝试阻止任务以某种方式执行,或者是否有其他方法。
这是 explicit contract
的完美用例。
使您的 Supervisor
使用不同的 Task
实现,从配置中读取:
@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
文档以获取灵感。