【问题标题】:"Could not lookup Ecto repo" error during tests测试期间出现“Could not lookup Ecto repo”错误
【发布时间】:2021-04-07 21:47:14
【问题描述】:

在尝试设置新的 ecto 存储库时,我遇到了以下异常。目前仅用于测试(因为我只是设置它)。

** (RuntimeError) could not lookup Ecto repo Lipwig.AnnotatedUnit.Repo because it was not started or it does not exist

当我的测试使用Lipwig.AnnotatedUnit.DataCase 时会发生这种情况。但是,当我使用 Lipwig.DataCase(引用 Lipwig.Repo`)时,测试运行良好。

我在项目中有以下设置。

defmodule Lipwig.Repo do
  use Ecto.Repo,
    otp_app: :lipwig,
    adapter: Ecto.Adapters.Postgres
end

defmodule Lipwig.AnnotatedUnit.Repo do
  use Ecto.Repo,
    otp_app: :lipwig,
    adapter: Ecto.Adapters.Postgres
end

这是我的测试设置

defmodule Lipwig.DataCase do
  use ExUnit.CaseTemplate

  using do
    quote do
      alias Lipwig.Repo

      import Ecto
      import Ecto.Changeset
      import Ecto.Query
      import Lipwig.DataCase
    end
  end

  setup tags do
    :ok = Ecto.Adapters.SQL.Sandbox.checkout(Lipwig.Repo)

    unless tags[:async] do
      Ecto.Adapters.SQL.Sandbox.mode(Lipwig.Repo, {:shared, self()})
    end

    :ok
  end

  def errors_on(changeset) do
    Ecto.Changeset.traverse_errors(changeset, fn {message, opts} ->
      Regex.replace(~r"%{(\w+)}", message, fn _, key ->
        opts |> Keyword.get(String.to_existing_atom(key), key) |> to_string()
      end)
    end)
  end
end

defmodule Lipwig.AnnotatedUnit.DataCase do
  use ExUnit.CaseTemplate

  using do
    quote do
      alias Lipwig.AnnotatedUnit.Repo

      import Ecto
      import Ecto.Changeset
      import Ecto.Query
      import Lipwig.AnnotatedUnit.DataCase
    end
  end

  setup tags do
    :ok = Ecto.Adapters.SQL.Sandbox.checkout(Lipwig.AnnotatedUnit.Repo)

    unless tags[:async] do
      Ecto.Adapters.SQL.Sandbox.mode(Lipwig.AnnotatedUnit.Repo, {:shared, self()})
    end

    :ok
  end

  def errors_on(changeset) do
    Ecto.Changeset.traverse_errors(changeset, fn {message, opts} ->
      Regex.replace(~r"%{(\w+)}", message, fn _, key ->
        opts |> Keyword.get(String.to_existing_atom(key), key) |> to_string()
      end)
    end)
  end
end

Lipwig.Repo 的其他数据案例几乎相同,只是引用了其他存储库。

我的config.exs 配置定义

config :lipwig,
  ecto_repos: [Lipwig.Repo, Lipwig.AnnotatedUnit.Repo]

我的test.exs 配置是

config :lipwig, Lipwig.Repo,
  username: "postgres",
  password: "postgres",
  database: "lipwig_test",
  hostname: "localhost",
  pool: Ecto.Adapters.SQL.Sandbox

config :lipwig, Lipwig.AnnotatedUnit.Repo,
  username: "postgres",
  password: "postgres",
  database: "lipwig_test",
  hostname: "localhost",
  pool: Ecto.Adapters.SQL.Sandbox

【问题讨论】:

  • 我相信你遗漏了Lipwig.DataCase 的代码——它和Lipwig.AnnotatedUnit.DataCase 有什么区别?另外,您是通过ecto_repos: [Some.Repo] 键在您的应用配置中启动哪个存储库?
  • 我当时明确添加了这些。 ecto_repos 两者都有。正如所描述的,两个数据案例几乎相同,我复制粘贴然后只是替换了 repo 名称。

标签: postgresql elixir ecto phoenix


【解决方案1】:

据我所知,配置看起来不错。正如错误所暗示的那样,我认为问题可能是因为您没有在应用程序中启动 Lipwig.AnnotatedUnit.Repo

/lib/lipwig_web 文件夹中查找application.ex 文件,并确保将Lipwig.AnnotatedUnit.Repo 添加到children 数组中。

希望这能解决?

【讨论】:

  • 谢谢。应用程序中缺少它。
猜你喜欢
  • 2021-09-09
  • 2021-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-12
  • 1970-01-01
  • 2016-06-01
相关资源
最近更新 更多