Rspec - izin ve daha önce blok arasındaki Fark
Arasındaki fark ve rspec blok izin vermeden önce nedir?
Ve bu blok kullanılır?
İyi yaklaşımın ne olacağı ya da örnekte önce içeri
let(:user) { User.make !}
let(:account) {user.account.make!}
before(:each) do
@user = User.make!
@account = @user.account.make!
end
Bu stackoverflow post okudum
Ama iyi yukarıdaki gibi dernek şeyler için izin tanımlamak için?
CEVAP
İnsanların ihtilafa düştükleri temel bazı yollar da açıkladığımız gibi, ama önce dışarı bıraktı (:) ve kullanıldığı tam olarak açıklamıyorsun.
Benim inancım odur ki, örnek değişkenleri yok yeri olarak kullanılan büyük bir çoğunluğu özellikleri, kısmen nedeniyle mezkur üst this article, ama bunu yapmayacağım söz olarak burada bir seçenek.
blok izin
let
bir blok içinde kod sadece başvurulan, tembel yükleme bu blokların sipariş ilgisi yoktur anlamına gelir bu zaman yürütülür. Bu tekrarlanan Kur üzerinde aşağı görüşler kesmek için büyük miktarda güç verir.
(Son derece yapmacık ve küçük) bu örneği:
let(:person) { build(:person) }
subject(:result) { Library.calculate_awesome(person, has_moustache) }
context 'with a moustache' do
let(:has_moustache) { true }
its(:awesome?) { should be_true }
end
context 'without a moustache' do
let(:has_moustache) { false }
its(:awesome?) { should be_false }
end
has_moustache
farklı her durumda tanımlı olduğunu görebilirsiniz, ama subject
tanımını tekrar etmeye gerek yok. let
son blok geçerli bağlamda tanımlanan kullanılacak önemli bir şey dikkat etmektir. Bu varsayılan gerekirse üzerine olan görüşler çoğunluğu için kullanılacak ayarı için iyidir.
Örneğin, calculate_awesome
dönüş değeri ise kontrol top_hat
10 *model true geçti, ama bıyıksız olacaktır:
context 'without a moustache but with a top hat' do
let(:has_moustache) { false }
let(:person) { build(:person, top_hat: true) }
its(:awesome?) { should be_true }
end
Başka bir şey için not edeyim bloklar, onlar kullanılmamalıdır eğer aradığınız bir şey getirilmemiş olan kayıtlı bir veritabanı (yani Library.find_awesome_people(search_criteria)
) gibi olmayacak veritabanına sürece onlar zaten başvuruyor. let!
before
bloklar kullanılmalıdır.
Ayrıca,aslahiçbefore
let
blok yürütme tetiklemek için kullanın, Bu let!
için yapılır!
izin verin! engeller
let!
blok tanımlanmış düzeni (daha önce bir blok gibi) yapılır. Bu değişken, örnek geri değişkenler düşmek gerek yerine daha açık bir başvuru olsun, bir temel fark blokları için önce.
let!
birden fazla blok aynı adla tanımlanırsa let
bloklar gibi en son yürütme kullanılacaktır. Temel fark let!
blok let
blok sadece son kez çalıştırır ise eğer bu şekilde kullanılırsa birden çok kez idam edilecektir.
(:her) önce engeller
before(:each)
blok önce varsayılan ve bu nedenle before(:each) {}
tam her zaman belirlemek yerine before {}
olarak başvurulabilir.
Birkaç temel durumlarda before
blokları kullanmak kişisel tercihim. Engellerse önce kullanacağım:
- Alay, stubbing veya iki katına kullanıyorum
- Herhangi bir makul büyüklükte Kur (genellikle bu fabrika özellikleri düzgün Kur henüz bir ibret) vardır
- Başvuru için doğrudan ihtiyacım yok ki elimizde çok sayıda var, ama kurulum için gereklidir
- Raylar fonksiyonel denetleyicisi testleri yazıyorum, ve test için özel bir istek (28* yani *) çalıştırmak istiyorum. Bir çok durumda bu
subject
kullanabilirsiniz olsa bile, eğer bir başvuru gerektirir ama bazen daha açık hissediyor.
Eğer varsa gözlüğüne before
büyük bloklar kendini ifade bulursanız, fabrikalarınız kontrol edin ve tam özellikleri ve esneklik anlamak emin olun.
(:) önce engeller
Bu sadece bir kez, geçerli bağlam (ve çocuklar) görüşler önce yürütülür. Bu eğer bu yürütme ve çaba azaltmak olabilir bazı durumlar vardır gibi doğru yazılmış, büyük bir avantaj için kullanılabilir.
Bir örnek pek yürütme zaman etkileyecek () sadece bir kez yapmanız gereken bir test ENV değişkeni, bir alay.
Yardımcı olur :) umarım
Bunu engellemek ve bir arasındaki fark...
Ekran arasındaki fark nedir: satır içi...
`İzin ver` ve `var` swift arasındaki f...
Bir özellik, bir istek spec arasındaki...
Ruby blok ve blok arasındaki fark...