【问题标题】:Rspec controller test expects object gots ActiveRecord::RelationRspec 控制器测试期望对象得到 ActiveRecord::Relation
【发布时间】:2019-12-19 21:18:24
【问题描述】:

我想使用此处的示例为我的控制器创建一个基本测试:https://relishapp.com/rspec/rspec-rails/docs/controller-specs

describe "GET index" do
    it "assigns @orders" do
      order = Order.create(id:1)
      get :index
      expect(assigns(:orders)).to eq([order])
    end
  end

结果是:

失败/错误:expect(assigns(:orders)).to eq([order])

   expected: [#<Order id: 1, quantity: nil, company_id: nil, created_at: nil, updated_at: nil>]
        got: #<ActiveRecord::Relation []>

我不明白为什么我得到ActiveRecord::Relation [] 而不是订单对象

【问题讨论】:

  • 为什么使用eq([order]) 而不是eq(order)
  • 您是否在控制器中设置@orders 变量?
  • @Sandra 结果相同
  • @bsvin33t 是的,我正在设置。
  • “我不明白为什么我得到 ActiveRecord::Relation [] 而不是订单对象” - 答案就在你的控制器中。你可能在那里有类似@orders = Order.all 的东西。这是一个懒惰的查询。在您尝试从中读取之前,它不会执行,而您在这里没有。解决此错误的最简单方法是使查询变得急切:Order.all.to_a。这给你一个数组。

标签: ruby-on-rails ruby rspec ruby-on-rails-5


【解决方案1】:

您可以改用match_array

it "assigns @orders" do
  order = Order.create(id:1)
  get :index
  expect(assigns(:orders)).to match_array([order])
end

【讨论】:

  • 我记得写过这样的代码,但我还没有测试过。 relish 上的示例具有相似的语法 - 创建一个数组并将其与关系匹配。
  • 有趣。我不认为我曾经尝试过针对关系,但我没有理由不信任文档。
猜你喜欢
  • 2016-05-23
  • 1970-01-01
  • 2014-06-25
  • 1970-01-01
  • 1970-01-01
  • 2020-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多