有条件地在测试中启动GenServer

时间:2018-02-23 19:17:39

标签: elixir phoenix-framework

我已经实现了一个通过长轮询侦听外部消息队列的GenServer。为此,我在应用程序启动时启动GenServer,即在我的start/2文件的application.ex函数内,我在主管列表中指定了一个额外的子项:

children = [
    supervisor(MyApp.Repo []),
    supervisor(MyAppWeb.Endpoint, []),
    supervisor(MyApp.MessageQueueGenServer, [])
]

然后以:

开始此列表
Supervisor.start_link(children, [strategy: :one_for_one, name: MyApp.Supervisor])

现在我遇到的问题是,当我使用mix ecto.reset(2)运行一些(1)数据库设置时,GenServer当然也已启动使用mix test进行测试。

对于测试(2),我可以,例如如果MyApp.MessageQueueGenServer,则仅将children添加到Mix.env != :test列表。

(1)呢?如何避免在运行mix ecto.reset / mix ecto.setup /等时启动GenServer?

1 个答案:

答案 0 :(得分:4)

我遇到了同样的问题,我用配置参数解决了这个问题。

配置/ config.exs

config :myapp, :children, [
  MyApp.Repo, MyAppWeb.Endpoint, MyApp.MessageQueueGenServer]

配置/ dev.exs

# config :myapp, :childen [] # tune it for dev here

配置/ test.exs

config :myapp, :children, [
  MyApp.Repo, MyAppWeb.Endpoint]

您的服务器文件

children = [
  :myapp
  |> Application.get_env(:children)
  |> Enum.map(&supervisor(&1, [])
]

旁注:您可能要考虑使用modern style of children declaration,因为Supervisor.Spec已被弃用,这样会更加清晰:

children = Application.get_env(:myapp, :children)