2016-04-13 17 views
3

這是一個非常簡單的問題,但我找不到任何解決方案。已經有3天了。請幫忙。索引中的RSpec for example_variable

所以我有這樣的

users_controller.rb

def index 
    @users = @users.normal.order(:name).page params[:page] 
end 

所以我有這個在我的users_controller_spec.rb

it "assign all normal users to @users" do 
    users = User.normal.all 
    get :index 
    expect(assigns(:users)).to eq(users) 
end 

我的代碼是從https://www.relishapp.com/rspec/rspec-rails/docs/controller-specs爲主。

在我的終端中運行rspec之後,這是輸出。

Diff: 
    @@ -1,4 +1,4 @@ 
    -[#<User:0x00000004aa32b0 
    +[#<User:0x00000004a085a8 
     id: 2, 
     name: "Christian Galamay", 
     admin: false, 
    @@ -20,7 +20,7 @@ 
     updated_at: Wed, 13 Apr 2016 01:46:17 UTC +00:00, 
     role: "Normal", 
     avatar: nil>, 
    - #<User:0x00000004aa2ea0 
    + #<User:0x000000049dbd78 
     id: 3, 
     name: "Grace Sojor", 
     admin: false, 
    @@ -42,7 +42,7 @@ 
     updated_at: Wed, 13 Apr 2016 01:46:17 UTC +00:00, 
     role: "Normal", 
     avatar: nil>, 
    - #<User:0x00000004aa2ab8 
    + #<User:0x000000049db760 
     id: 4, 
     name: "Karl Pandacan", 
     admin: false, 

輸出表示所有值都是相同的,除了用戶之後的十六進制。所以我的問題是(1)爲什麼比較兩個ActiveRecord中包含User後的十六進制(2)是否有任何方法或函數用於忽略User中的十六進制。謝謝

回答

2

輸出是有些誤導。這兩個東西並不相等,因爲它們是關係對象,並且兩個ActiveRecord::Relation對象之間的==通過比較生成的sql而工作。在你的情況下,關係是不相同的:在控制器中,你正在分頁並設置一個訂單。

Rspec試圖通過顯示2個對象的to_s輸出的差異來幫助,但是這最終會比較查詢的結果(它確實是相同的對象),因此它在該字符串中找到的唯一區別輸出是對象ID。這部分是運氣 - 沒有訂單條款的物品可能以不同的順序返回。要明確:顯示的差異輸出只是爲了幫助你,並不意味着rspec是如何進行比較的。

如果你想要的是比較查詢的結果,那麼你可以使用to_a做到這一點:

expect(assigns(:users)).to eq(users.to_a) 

如果你不在乎爲了你也可以做

expect(assigns(:users)).to match_array(users) 

這是一個稍微不同的測試:如果數據庫決定返回不同的結果,則不會失敗,如上所述,這是可能的。

+0

我已經添加to_a,它測試:) –

3

你可以簡單地檢查用戶的陣列,而不是主動記錄關係

expect(assigns(:users).to_a).to eq(users.to_a) 
2

你的陣列中值等價的,但是你的天賦是失敗,因爲你比較基準的平等,而不是因爲價值等式您的控制器將用戶加載到一個單獨的變量中,而不是您的規格。

嘗試使用as_json比較您的收藏價值:

expect(assigns(:users).as_json).to eq(users.as_json) 
+0

解釋不正確:'eq'匹配使用'=='而不是'相等?' –

+0

我嘗試添加to_a,並且它已經通過。謝謝:) –