Phoenix with exq:如何在不运行redis的情况下执行混合测试



我在Phoenix 1.4.16的Phoenix应用程序中使用exq来运行一些后台作业。

其中一个可以像这样简单:

defmodule PeopleJob do
def perform(request) do
IO.puts("Hello from PeopleJob:n#{inspect(request)}")
end
end

它在开发环境中完美地与redis一起运行。

问题是,当我将代码推送到没有redi的CI服务器时,所有测试都会失败。

测试配置如下

配置/测试.exs中:

config :exq, queue_adapter: Exq.Adapters.Queue.Mock

测试/test_helper.exs中:

Exq.Mock.start_link(mode: :inline)

当我在没有redis运行的机器上运行"混合测试"时,它会失败,如下所示:

** (Mix) Could not start application exq: Exq.start(:normal, []) returned an error: shutdown: failed to start child: Exq.Manager.Server
** (EXIT) an exception was raised:
** (RuntimeError)

====================================================================================================
ERROR! Could not connect to Redis!
Configuration passed in: [host: "127.0.0.1", port: 6379, database: 0, password: nil]
Error: :error
Reason: {:badmatch, {:error, %Redix.ConnectionError{reason: :closed}}}
Make sure Redis is running, and your configuration matches Redis settings.
====================================================================================================
(exq) lib/exq/manager/server.ex:393: Exq.Manager.Server.check_redis_connection/1
(exq) lib/exq/manager/server.ex:173: Exq.Manager.Server.init/1
(stdlib) gen_server.erl:374: :gen_server.init_it/2
(stdlib) gen_server.erl:342: :gen_server.init_it/6
(stdlib) proc_lib.erl:249: :proc_lib.init_p_do_apply/3

事实上,我尝试了:redis:fake:inline这三种模式,但它们都无法启动混合测试。

问题:我可以在没有redis的机器上运行">混合测试"吗?

原因是我们公司不想在Travis CI机器上安装redis。

我原以为在测试环境中使用Exq-Mock可以让测试在没有redis的情况下运行,但事实并非如此。

我想明白了。

配置/测试.exs中:

config :exq, queue_adapter: Exq.Adapters.Queue.Mock
config :exq, start_on_application: false

测试/test_helper.exs中:

Exq.Mock.start_link(mode: :inline)

config :exq, start_on_application: false添加到config/test.exs解决了这个问题。

相关内容

最新更新