测试时导致问题的任务

Posted

技术标签:

【中文标题】测试时导致问题的任务【英文标题】:Task causing issues while testing 【发布时间】:2018-04-20 09:11:41 【问题描述】:

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

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

附带说明,测试没有失败。它只打印堆栈跟踪。

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

【问题讨论】:

我不明白这和你的主管有什么关系。您是否只是在尝试测试单个主管功能而不实际启动主管? 我想阻止任务执行,因为它与我的测试无关,并且在我的测试输出中抛出堆栈跟踪。我认为这种方法是阻止主管运行,因此任务不会执行。我不确定这是否是正确的方法,如果是,我不知道该怎么做。 【参考方案1】:

这是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 文档来获得灵感。

【讨论】:

以上是关于测试时导致问题的任务的主要内容,如果未能解决你的问题,请参考以下文章

课后作业-阅读任务-阅读笔记-4

课后作业-阅读任务-阅读提问-2

DevOps会导致测试人员失业,何去何从(中)?

Java - 如何调试任务 ?

记一次Laravel定时任务导致日志没有写入权限的坑

调用挂在 Heroku 环境中的 celery 任务