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

时间:2015-11-12 03:29:53

标签: elixir phoenix-framework ecto

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

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

我定义了2个Repos,每个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选项传递正确的仓库。

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

我的环境:

  • Elixir:1.1.1
  • 凤凰城:1.0.3
  • Ecto:1.0.6

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

首先,您需要在 id keyword count 0 0 a 10 1 0 b 9 2 0 c 9 3 1 a 1 4 1 b 10 5 1 c 10 6 2 a 9 7 2 b 0 8 2 c 5 9 3 a 6 10 3 b 0 11 3 c 8 12 4 a 0 13 4 b 3 14 4 c 8

中启动回购
<asp:TextBox ID="txtTsCs"
             runat="server"
             tabindex="7"
             placeholder="Terms & Conditions"
             TextMode="MultiLine"
             Width="210px"
             Height="254px">
</asp:TextBox>

接下来,在lib/my_app.ex

中准备回购
# Start the Ecto repository
worker(MyApp.DbStatusRepo, []),
worker(MyApp.DbDefinitionRepo, []),

答案 1 :(得分:0)

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(...)