【问题标题】:ExUnit triggers Empty Error with setup_all blockExUnit 使用 setup_all 块触发空错误
【发布时间】:2018-10-26 18:03:08
【问题描述】:

我有一个需要预先插入数据的测试。

所以我尝试使用setup_all 回调设置这些数据,因为这些数据可以设置一次。

因为我不想给上下文分配任何东西,所以我定义了setup_all,如下所示

setup_all do
  create_languages() 
  create_regions()
  create_currencies() 
  create_user()
  :ok
end

每个测试都有一个函数,从创建的数据中获取一个结构体。

例如,其中一项测试如下:

test "update_core/2 (region_id) with valid data, updates core" do
  region = get_region()
  core = create_core()

  {:ok, core} = Cores.update_core(core, %{region_id: region.id})

  assert region.id == core.region_id
end

但是,region = get_region() 会触发空错误。为什么这个函数可以得到struct? IO.inspect 显示 create_regions() 实际上创建了多个区域。我在这里遗漏了什么吗?

提前谢谢你。

【问题讨论】:

    标签: elixir ex-unit


    【解决方案1】:

    很有可能在您的:test 环境中,Ecto 已配置为在沙盒模式下使用或设置为在每次测试后重置数据库。所以你应该使用setup 块而不是setup_all

    setup do
      create_languages() 
      create_regions()
      create_currencies() 
      create_user()
      :ok
    end
    

    setup 块在每次测试之前被调用,而setup_all 只被调用一次。

    【讨论】:

    • 我之所以要使用setup_all而不是setup是因为setup会调用每个单独的测试,所以需要很长时间才能完成......
    • 是的,但这是正确的方法,因此不同的测试不会相互干扰。为了加快测试速度,您可以通过将 async 标签设置为 true 来确保 Ecto 确实设置为沙盒模式,并确保 run them concurrently
    猜你喜欢
    • 2012-12-01
    • 2019-05-27
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    • 2018-07-22
    • 2021-07-06
    • 2016-07-30
    • 2016-12-19
    相关资源
    最近更新 更多