postgresql Elixir Postgres视图在测试时返回空数据集

vuv7lop3  于 2022-11-29  发布在  PostgreSQL
关注(0)|答案(1)|浏览(124)

我试图测试一个在Postgres中创建的视图,但是它返回了一个空的结果集。然而,当在Elixir交互式环境中测试该视图时,我得到了预期的数据。下面是我创建和测试该视图所采取的步骤:
1.创建迁移:

def up do
   execute """
     CREATE VIEW example_view AS
     ...

1.创建架构:

import Ecto.Changeset

  schema "test_view" do
   field(:user_id, :string)

1.测试项目:

describe "example loads" do
   setup [
     :with_example_data
   ]

   test "view" do
     query = from(ev in Schema.ExampleView)
     IO.inspect Repo.all(query)
   end
 end

返回的响应是空数组[]
是否缺少允许在测试中测试视图的设置?

rxztt3cl

rxztt3cl1#

正如其中一条评论所指出的:

  • iex、mix phx.server...在:dev环境和开发数据库上运行
  • 测试使用:test环境并在单独的DB上运行

这实际上非常有意义,因为您希望您的测试套件是可重复的,并且独立于您可能在开发环境中创建/编辑的任何记录。
您可以在:test环境中打开iex,以确认您的查询也在此处返回空数组:

MIX_ENV=test iex -S mix

您需要在查询之前用一些已知的记录填充测试数据库。至少有两种方法可以实现这一点:固定装置和种子。
1.固定装置:

  • 定义一些帮助函数以在test/support/test_helpers.ex中创建记录(通常为:获取一些attrs,添加一些默认值并从上下文中调用一些create_函数)
def foo_fixture(attrs \\ %{}) do
    {:ok, foo} =
      attrs
      |> Enum.into(%{name: "foo", bar: " default bar"})
      |> MyContext.create_foo()

    foo
  end
  • 在查询之前在setup函数或测试用例中调用它们
  • 附带说明:您应该将DataCase用于涉及DB的测试。使用DataCase,每个测试都被 Package 在它自己的事务中,并且您创建的任何fixture都将在测试结束时被回滚,因此测试彼此隔离和独立。

1.种子:

  • 如果您想将一些“持久”记录作为“默认状态”的一部分(例如,国家/地区、类别列表...),您可以在priv/repo/seeds.exs中定义一些种子。
  • 该文件应该是由phoenix生成器创建的,并指示如何添加种子(通常使用Repo.insert!/1
  • 默认情况下,每当您在迁移之后运行mix ecto.setupmix ecto.reset时,mix都会运行这些种子(无论使用什么环境)
  • 要在seeds.exs中应用任何更改,可以运行以下命令:
# reset dev DB
mix ecto.reset
# reset test DB
MIX_ENV=test mix ecto.reset
  • 如果您需要一些特定于环境的种子,您可以始终引入不同的种子文件(例如dev_seeds.exs)并修改您的mix.exs以配置ecto.setup
  • 种子不仅对测试很有帮助,而且对项目早期阶段的开发/准备也很有帮助,因为您还在对模式进行大量修改,并且经常删除DB。

我通常会混合使用这两种方法。

相关问题