rSpec == / eql无法比较'相同'的东西

时间:2011-09-08 10:15:51

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

我有一个获得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中如何通过相同的测试。

2 个答案:

答案 0 :(得分: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提供了延迟加载模式,因此您没有对该步骤执行任何查询。这意味着在第一次请求时触发查询

答案 1 :(得分:1)

如果要比较数组,则应编写

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