如何测试多数据库 Elixir(Phoenix、Ecto)应用程序

How to test a multi database Elixir (Phoenix, Ecto) app

访问多个数据库的 运行ning 测试的正确方法是什么?

我正在写一个必须访问多个数据库的小 API。

我定义了 2 个 Repos,每个都包装了不同的数据库:

# config/dev.exs, config/test.exs, ...
config :my_app, MyApp.DbStatusRepo,
  adapter: Ecto.Adapters.Postgres,
  ....

config :my_app, MyApp.DbDefinitionRepo,
  adapter: Ecto.Adapters.Postgres,
  ...

# lib/my_app/db_status_repo.ex
defmodule MyApp.DbStatusRepo do
  use Ecto.Repo, otp_app: :my_app
end

# lib/my_app/db_definition_repo.ex
defmodule MyApp.DbDefinitionRepo do
  use Ecto.Repo, otp_app: :my_app
end

这在 运行 连接服务器时有效,但我找不到 运行 我的测试的方法,因为他们不期望默认 MyApp.Repo.

我更新(并添加)了两个存储库的别名。

我更改了对 Repo 的所有引用,但我很确定它在运行我的测试套件之前失败了。

运行 混合测试 产生以下错误:

(Mix) 无法加载 SourcesApi.Repo,错误::nofile。请使用 -r 选项传递正确的 repo。

使用 -r 选项传递另一个 repo 不会改变任何东西。同样的错误。

我的环境:

感谢您的帮助。

MyApp.Repotest/support/conn_case.ex 的别名,这就是为什么您可以调用 Repo.get(...):

  using do
    quote do
      # Import conveniences for testing with connections
      use Phoenix.ConnTest

      alias MyApp.Repo
      ...
    end
  end

  setup tags do
     unless tags[:async] do
       Ecto.Adapters.SQL.restart_test_transaction(MyApp.Repo, [])
     end

    :ok
  end

您需要将该别名更新为您指定的存储库之一。但是,如果您有两个用于不同目的的存储库,那么您应该在每个相关时明确使用 MyApp.DbStatusRepo.get(...)MyApp.DbDefinitionRepo.get(...)

首先,您需要在 lib/my_app.ex

开始回购
# Start the Ecto repository
worker(MyApp.DbStatusRepo, []),
worker(MyApp.DbDefinitionRepo, []),

接下来,在 test/test_helper.exs

中准备回购
Mix.Task.run "ecto.create", ["--quiet", "-r", "MyApp.DbDefinitionRepo"]
Mix.Task.run "ecto.migrate", ["--quiet", "-r", "MyApp.DbDefinitionRepo"]
Ecto.Adapters.SQL.begin_test_transaction(MyApp.DbDefinitionRepo)