2011-09-08 53 views
3

我有一个控制器索引测试来获取ActiveRecord作用域。 测试目前看起来是这样的(包括一些在线调试东西):rSpec ==/eql无法比较'相同'的东西

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中如何通过相同的测试。

+0

你要验证的类或对象人口?关系提供惰性加载,所以你没有任何执行的查询的步骤 – Anatoly

+0

啊是的,我明白了,所以使用'.all'或'.to_a'会调用查询吗? – stuartc

+1

是的,懒加载意味着火第一次请求查询 – Anatoly

回答

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)) 

更新:关系提供延迟加载模式,所以你不要对任何一步执行的查询。这意味着火上一次请求

+0

我这种情况下,我并不像我平时所做的那样嘲笑或琢磨,我只是测试控制器从模型中获取正确的东西。 我只是好奇它为什么认为它们不同,以及这个测试是如何在老版本的Rails和/或rSpec中传递的。 – stuartc

+0

实际上,使用当前的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 –

1

如果要比较数组查询,你应该写

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

没有数组 – Anatoly

+0

如果关系被评估,你会得到一个数组。 – nathanvda

+0

在这种情况下,是的 – Anatoly