2011-03-21 13 views
5

Yani RSpec ile Rails böyle bir şey var:rspec'de bir lambdadan sonra birden fazla şey nasıl test edilir?

it "should create a new user" do 
    lambda do 
    post :create, @attr 
    end.should change(User,:count) 
end 

Ama mesaj: oluşturmak, @attr bir kullanıcı ve bir Şirket hem oluşturur, bu yüzden nasıl yaparım "zincir" aramaları böylece değişiklik İkisini de test edebilir miyim? Aradığım şey, end.should change(User,:count) && change(Company,:count)

cevap

8

Aradığımda tek bir testte fazla bir şey denemeye çalıştığınızı ve testin adıyla uyuşmadığını iddia ediyorum. Bunun yerine bu düşünün: Ayrıca

it "should create a new user" do 
    lambda do 
    post :create, @attr 
    end.should change(User,:count) 
end 

it "should create a new company" do 
    lambda do 
    post :create, @attr 
    end.should change(Company,:count) 
end 

, aynı şeyi yapar bu iddiaların yazma güzel yol olduğunu unutmayın, ama çok daha güzel okur olmayabilir:

expect { 
    post :create, @attr 
}.to change(Company, :count) 
+0

Ooh, yazmanın güzel yolu, gratz. Daha fazla test ettikten ve üzerinde uyuduktan sonra, size katılıyorum. – Houen

0

@idlefingers - re :

"Ben tek bir testte çok için savunmak için çalışıyoruz iddia ediyorum ve testin adı eşleşmiyor"

  • Bazen, performans nedenleriyle ve test paketini zaman aşımına uğratmak için başka bir onaylama işlemi yapmak için ayrı bir örnek istemiyorum.

Bundan kaçınmak için, bu hileyi kullanabilirsiniz: birkaç yıl için bir geliştirici olarak büyüyen sonra

def user_and_company_count 
    User.count + Company.count 
end 

it "can assert both counts" do 
    expect { post :create, @attr }.to change(self, :article_an_activity_count).by(2) 
end 
+0

Hey, Yusuf Bey, cevap için teşekkürler. Hala idlefingerlerle testimin çok fazla uğraştığını kabul ederken, bir seferde birden fazla şeyi test etmenin iyi bir yolunu buldum. 'Birden çok değer' bölümüne bakın: http://blog.houen.net/rspec-expect-change-record-value/ – Houen

1

, ben gerektiğinde birden fazla değer test etmek için oldukça temiz bir çözüm buldum:

expect{ execute }.to change{ [spe1.reload.trashed?, spe2.reload.trashed?] }.from([true, true]).to([false, false]) 

Ama birden çok kayıt oluşturulmasını test etmek gerekiyor zaman:

[User, Company].each do |klass| 
    it "creates one #{klass}" do 
    expect{ post :create, valid_args }.to change(klass, :count).by(1) 
    end 
end 
+0

Ve yukarıdakiler, iş durumuyla eşleşen bir bağlamda sarılmalıdır. – Houen

İlgili konular