我已经实现了一个通过长轮询侦听外部消息队列的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?
答案 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)