2010-11-11 40 views
45

Özel bir yöntemle modele sahibim: RSpec,
ile nasıl yapmak istersiniz? Yalnızca özel olanı arama yöntemini test ediyor musunuz?
veya ayrıca özel olanı? eğer öyleyse, nasıl yaparsınız?Özel yöntem nasıl eklenir

cevap

109

Her zaman bu yaklaşımı uygularım: Sınıfımın ortaya çıkardığı ortak API'yi test etmek istiyorum.

Özel yöntemleriniz varsa, bunları yalnızca diğer sınıflara gösterdiğiniz genel yöntemlerden çağırırsınız. Bu nedenle, bu kamu yöntemlerinin her koşulda beklendiği gibi çalıştığını test ederseniz, aynı zamanda kullandıkları özel yöntemlerin de çalıştığını kanıtlamış olursunuz.

Özellikle karmaşık özel yöntemlerle karşılaştığımı kabul ediyorum. Bunları test etmek istiyorum ekstrem durumda, bunu yapabilirsiniz: Kod kapsama ihtiyaç özel yöntemleri için

@obj.send(:private_method) 
+1

Yardımlarınız için teşekkürler, kamu yöntemini sınamanın da özel bir çalışmayı kanıtladığına katılıyorum. Burada söylenilen gerçekten özel yöntemi test etmek istiyorum ve çözümünüz bir çekicilik gibi çalışıyor, teşekkürler! – Mike

+2

İşte bir başka ilginç yaklaşım http://kailuowang.blogspot.com/2010/08/testing-private-methods-in-rspec.html – gucki

+1

Modelimde, özel bir veri tabanını özel bir veri tabanını özel bir veritabanından kaydeden bir kanca var. 'make_private_token' yöntemi. 'Make_private_token' yöntemi genel sınıf yöntemlerini kullanır, diğer yöntemlerle değil, bu yüzden test edebilmemin tek yolu 'gönder 'yöntemidir. Bu konuda aşırı bir şey görmüyorum ... – Starkers

6

(geçici veya kalıcı), geçici bir bağlamda özel yöntemler ifşa etmeye rspec-context-private gem kullanın.

gem 'rspec-context-private' 

Projenize paylaşılan bir bağlam ekleyerek çalışır. Bir describe bloğuna meta veri olarak :private geçirirseniz

RSpec.shared_context 'private', private: true do 

    before :all do 
    described_class.class_eval do 
     @original_private_instance_methods = private_instance_methods 
     public *@original_private_instance_methods 
    end 
    end 

    after :all do 
    described_class.class_eval do 
     private *@original_private_instance_methods 
    end 
    end 

end 

Ardından, özel yöntemler bu bağlamda herkese açık olacaktır.

class Example 
    private def foo 
    'bar' 
    end 
end 

describe Example, :private do 
    it 'can test private methods' do 
    expect(subject.foo).not eq 'bar' 
    end 
end 
+0

Artık bu gemiyi sürdürüp sürdürmediğinizi bilmiyorum, ancak belgeleriniz shared_context bildirmekle ilgili kod bloğuna sahip değil. Bu yüzden sadece belgeleri okuyarak çalışmayı başaramadım. Bu bloğa ekledikten sonra beklendiği gibi çalışıyor. – istrasci

0

Özel bir yöntem üzerinde bir beklenti test etmek isteyen konum, kabul cevabı gerçekten işe yaramaz (bildiğim, bu yüzden bu noktada düzeltme açığım en az değil). Ne var onun yerine yaptık bile filthier olduğunu - testte kendisinde, sadece onu yeniden tanımlayarak yöntem maruz: Ruby 1.8 üzerinde

def object_to_test.my_private_method 
    super 
end 

Çalışır, yeni çalıştırmalar herhangi yorum yapamam.

İlgili konular