2012-11-28 27 views
7

ı sınıfları Araç ve Mekanik var diyelim sabitleri. Araba "koşmak" yöntemine sahiptir. Mekanik bir sebepten dolayı Araba gerektirir. Sonra RSpec özellikleri yazarım.iyi uygulama veya geçici çözüm

class Car; end 

ve daha sonra mekanik üzerine kullandığı yöntemi saplama: makinist olarak böyle bir sahte clas tanımlar. Testleri ayrı ayrı çalıştırırsam her şey yolunda gider. Ancak her iki testi birlikte çalıştırdığımda (rspec spec/directory /) Mekanik özelliklerim gerçek Car sınıfını kullanır.

So. Bunun nedeni, ruby ​​sınıflarının “açık” olması ve daha önce sınıfı bir kez Otomobil özellikleri için yüklemiş olmalarıdır. Ama bunu yapmanın daha iyi bir yolu var mı? Bu tür durumlar için en iyi uygulamalar nelerdir? Bu, kodumun bazı geliştirmelere ihtiyaç duyduğu anlamına mı geliyor?

github hızlı bir demo yaptı: Yakut Sınıflar beri https://github.com/depy/RspecTest

cevap

2

Bu sahte sınıf alışkanlık iş açıktır.

Kullanabileceğiniz bir yaklaşım, nesneleri istediğiniz gibi başlatmak için let kullanmaktır ve gerekirse daha önce bir blokta ilişkiyle birlikte çalışmaktır. Stubs, önceki blokların içine de girebilir. = P bu olur

Umut! aşağıdaki gibi kod Verilen bir bütün

olarak test:

  • ünite özellikleri: izolasyon her sınıf test
  • entegrasyon özellikleri

+0

Ancak bazen bir sınıfa ihtiyaç duyduğumda bu sınıf başka bir şey içerir. İhtiyaç duymadan önce "başka" demem gerekiyor. Buna ne dersin? –

+0

Daha önce blokta yapmanı söylediğim davranış. Sınıflarınızın her biri için 2 izin, 1 olabilir ve önceki blokta olduğu gibi, ilk nesnedeki bir aramayı temel alarak diğer nesneyi döndürmek için bir saplama yapabilir. –

2

Ben ne gerek iki katmanlı test olduğunu düşünüyorum :

class Car 
end 

class Mechanic 
    def fix(car) 
    # do something here 
    end 
end 

birim özellikler için ben örneğin, bağımlılıkları saplama olacaktır:

describe Mechanic do 
    let(:mechanic) { described_class.new } 
    let(:car)  { stub(stubbed_method_on_car: 14) } # Or just OpenStruct.new(stubbed_method_on_car: 14) 

    it 'does some stuff' do 
    mechanic.fix(car).should eq true 
    end 
end 

entegrasyon özellikler için bunu yapmak olacaktır:

describe Mechanic do 
    let(:mechanic) { FactoryGirl.create(:mechanic) } 
    let(:car)  { FactoryGirl.create(:car) } 

    it 'does some stuff' do 
    mechanic.fix(car).should eq true 
    end 
end 
+0

Birim özellikleri için, iki 'let' yönteminin bloklarının neler yaptığını açıklayabilir misiniz? – knownasilya

+0

Hm. Actuall örneği, Task örneğinin başlattığı yayımlama yöntemini içeren NotificationService sahip olduğumdur. NotificationService.publish içinde Bildirim nesnesi oluşturulur ve yayınlanır. Görev, NotificationClass hakkında bir şey bilmek istemiyorum, sadece yayınlama için NotificationService kullanabileceğini ve hizmetin diğer tüm şeyleri yapabileceğini biliyor. Ama nasıl test ederim ve tüm ünite testlerini ayrı ayrı değil, birlikte çalıştırabiliyorum. Bildirim sınaması nedeniyle NotificationService'in gerçek Bildirim sınıfını kullanmasını istemiyorum. Ben yapılan umut olduğu açıktır ... :) –

+0

@Knownasilya: kısacası 'örnek değişkeni' için bir erişimci ayarlar let': mechanic' -> '@ mechanic' bozulmamış halde –

İlgili konular