【问题标题】:rSpec ==/eql can't compare the 'same' thingsrSpec ==/eql 无法比较“相同”的东西
【发布时间】:2011-09-09 14:06:34
【问题描述】:

我有一个获取 ActiveRecord 范围的控制器索引测试。 目前的测试看起来像这样(包括一些内联调试的东西):

describe "GET index" do
  it "assigns all schools as @schools" do
    get :index
    puts assigns(:schools).class
    puts School.populated.class
    assigns(:schools).should == School.populated
  end
end

输出是这样的:

ActiveRecord::Relation
ActiveRecord::Relation

expected: []
     got: [] (using ==)
Diff:

这绝对不是我第一次在最近版本的 Rails 和 rSpec 中遇到这种情况。 以前,同事只会将项目包装在 to_a 中进行比较,我觉得这有点脏,可能不是一个好的解决方案。

有什么想法吗?我很好奇为什么它认为它们是不同的,以及相同的测试是如何在旧版本的 Rails 和/或 rSpec 中通过的。

【问题讨论】:

  • 您要验证类或对象的数量吗? Relation 提供了延迟加载,因此您在该步骤上没有任何执行的查询
  • 啊,是的,我明白了,所以使用 .all.to_a 之类的东西会调用查询?
  • 是的,延迟加载意味着在第一次请求时触发查询
  • 如果你能把它变成一个答案,我很乐意接受! :)

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


【解决方案1】:

eql== 相同。仅 Rspec 演讲的作者不要使用 !=,而是使用 should_not

actual.should == expected
#is interpreted as this:

actual.should.==(expected)

#This is not true for !=. Ruby interprets this: actual.should != expected
#as follows:

!(actual.should.==(expected))

更新:Relation 提供了延迟加载模式,因此您在该步骤上没有任何执行的查询。这意味着在第一次请求时触发查询

【讨论】:

  • 在这种情况下,我并没有像往常那样嘲笑或存根,我只是在测试控制器是否从模型中获取正确的内容。我只是好奇为什么它认为它们是不同的,以及相同的测试是如何在旧版本的 Rails 和/或 rSpec 中通过的。
  • 实际上对于当前的 RSpec + Rails + Ruby 版本 eql 与 ActiveRecord 查询的 == 不同。对于相同的模型,与 eql 比较对我来说返回 false == 返回 true。我认为 eql 失败是因为 'created_at' 和 'updated_at' 时间在某种程度上略有不同 - 我想这是一个类型不匹配(double vs int):2012-07-06 16:09:41 vs 2012-07-06 16:09 :41.760623
【解决方案2】:

如果你想比较数组,你应该写

 assigns(:schools).all.should =~ School.populated.all

【讨论】:

  • 如果关系被评估,你会得到一个数组。
猜你喜欢
  • 1970-01-01
  • 2016-12-05
  • 2013-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-23
相关资源
最近更新 更多