如何测试多数据库 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 不会改变任何东西。同样的错误。
我的环境:
- 长生不老药:1.1.1
- 凤凰:1.0.3
- 外: 1.0.6
感谢您的帮助。
MyApp.Repo
是 test/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)
访问多个数据库的 运行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 不会改变任何东西。同样的错误。
我的环境:
- 长生不老药:1.1.1
- 凤凰:1.0.3
- 外: 1.0.6
感谢您的帮助。
MyApp.Repo
是 test/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)