2011-09-08 56 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