2016-04-13 23 views
3

Bu çok kolay bir soru ama bunun için herhangi bir çözüm bulamıyorum. 3 gün oldu. Lütfen yardım et. Dizin için örnekte RSpec RSPEC

yüzden

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

users_controller.rb bu var Bu yüzden

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

Kodum https://www.relishapp.com/rspec/rspec-rails/docs/controller-specs den dayanır benim users_controller_spec.rb içinde bu var.

Terminalimde rspec'i çalıştırdıktan sonra, bu çıktıdır.

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, 

çıkışı tüm değerler Kullanıcı sonra onaltılık hariç aynıdır söylüyor. Bu yüzden sorum şu: (1) Kullanıcıdan sonraki onaltılık neden iki ActiveRecord'u karşılaştırmaya dahil edilir (2) Kullanıcıdaki onaltıyı yok saymak için kullanılacak herhangi bir metot veya fonksiyon var mı? Sen

cevap

2

çıkışı biraz yanıltıcı. 2 şey eşit değildir çünkü bunlar ilişki nesneleridir ve iki ActiveRecord::Relation nesnesi arasındaki == nesneleri, oluşturulan sql'yi karşılaştırarak çalışır. Sizin durumunuzda ilişkiler eşit değildir: kontrolörde paginasyon yapıyor ve bir sipariş veriyorsunuz.

Rspec, 2 nesnenin to_s çıktısının farklılığını göstererek yardımcı olmaya çalışır; ancak bu, sorgunun sonucunu (aslında aynı nesneler) ve dolayısıyla bu dizede bulduğu tek farkı karşılaştırır. çıktı nesne kimlikleridir. Bu kısmen şans - hiçbir cümle olmadan nesneler farklı bir sırayla iade edilmiş olabilirdi. Açık olmak gerekirse: gösterilen çıkış, sadece size yardımcı olmak için oradadır, bu, rspec'in karşılaştırma nasıl yaptığı anlamına gelmez. Ne istediğiniz sorgunun sonuçları karşılaştırmak ise

, o zaman bunu yapmak için to_a kullanabilirsiniz: Eğer sipariş hakkında önemsemiyorsan

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

da yapabilirdi

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

Bu biraz farklı bir testtir: db sonuçları farklı bir sonuç vermeye karar verirse başarısız olur, bu da yukarıda belirttiğim gibi mümkündür.

+0

Zaten to_a ekledim ve test ediyor :) –

3

sadece kullanıcıların dizi yerine aktif rekor ilişkisini kontrol edebilirsiniz ederiz

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

Sizin diziler Bunun yerine değer eşitliği beri daha referans eşitliği karşılaştırarak çünkü ancak senin Spec başarısız, değer eşittir kontrol cihazınız kullanıcıları özelliklerinden farklı bir değişkene yüklüyor. as_json kullanarak toplama değerlerini karşılaştırarak

Dene:

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

Açıklama doğru değil: "eq" eşleştiricisi ile karşılaştırılıyor == 'değil' eşittir? –

+0

to_a eklemeye çalışıyorum ve zaten geçiyor. teşekkür ederim :) –