2016-03-25 20 views
0

Testlerimin içinde let(:foo) { create_foo() } kullanıyorum. create_foo, bazı oldukça pahalı kurulum yapan bir test yardımcıdır.Örnekler arasında RSpec let (: foo) kullanın

Her seferinde bir sınama çalıştırılır, foo oluşturulur ve bu biraz zaman alır. Bununla birlikte, foo nesnesinin kendisi değişmez, sadece tek bir test olarak ayrılmış, tek tek nesne test yöntemleri istiyorum.

Yani, let bir RSpec eşdeğer birden örnekler arasında değişkeni paylaşan ancak (foo gerekli değilse) tembel yükleme gibi güzel şeyler tutmak ve böylece foo da otomatik yöntem tanımı orada Paylaşılan örneklerde, @foo ile başvurmadan kullanılabilir?

Ya ben sadece sadece paylaşılan örneklerde koydu ama Memoization kullanabilir miyim bir

def foo 
    create_foo() 
end 
+0

Nesneniz test paketindeki bir noktada bir kez başlatılmış ve değişmediğinden, bazı 'before (: suite)' yapılandırmasında 'create_foo 'sonucunu' FOO 'sabitine atayarak yapabilmenizi sağlar İstediğiniz? –

cevap

1

tanımlamak gerekiyor?

def foo 
    @foo ||= create_foo() 
end 
+0

Sadece bunu test ettim, paylaşımlı örneklerle kullandığımda '@ foo 'bir şekilde örneklerim – 23tux

1

Bu şekilde, let kullanımı, bunun için tasarlandığına aykırıdır. Bir kez deney grubu başına çalışan before_all kullanmayı düşünmelisiniz: create_object() bir veritabanı vurursa o bağlantı tanıtmak ve testler arasında durumunu korumak olabileceğinden

before :all do 
    @instancevar = create_object() 
end 

bu akıllıca olmayabilir unutmayın.

+0

veya' before: suite' arasında silinir –