2008-09-16 15 views
3

Ben Ruby ile oynuyor ve onu sevmek için bir Java geliştiricisiyim. Ruby'nin metaprogramlama olanakları nedeniyle ünite testlerimin daha temiz hale geldiğini ve kötü alay çerçevelerine ihtiyacım olmadığını anladım. File sınıfının hizmetlerine ihtiyaç duyan bir sınıfım var ve testimde gerçek dosya sistemime dokunmak istemiyorum. Java'da, Ruby'de sahte nesneler geçirmek için daha kolay "dikişler" yapmak için bazı sanal dosya sistemi kullanacağım. Geldiğim şey, Java dünyasına kıyasla çok güzel görünüyor.Ruby'de bir angajman yapıcılar

@file_class.open(filename) 

Ve çağrı ya gerçek gider: benim sınıf içindeki dosyaları açmak gerektiğinde

def initialize(file_class=File) 

, o zaman bunu yapabilirsiniz: test altında Benim sınıfımda ben isteğe bağlı bir yapıcı parametresi var Dosya sınıfı veya birim testim durumunda, dosya sistemine dokunmayan sahte bir sınıfa gider. Bunu metaprogramlama ile yapmanın daha iyi bir yolu olmalı.

cevap

11

Mocha (http://mocha.rubyforge.org/) yakut için çok iyi bir alay kütüphanesidir. Neyi test etmek istediğinize bağlı olarak (yani, sadece dosya sistemi bağımlılığından kaçınmak için File.new çağrısını fake etmek istiyorsanız veya doğru argümanların File.new'a aktarıldığını doğrulamak istiyorsanız) Böyle bir şey:

 

require 'mocha' 

mock_file_obj = mock("My Mock File") do 
    stubs(:some_instance_method).returns("foo") 
end 

File.stubs(:new).with(is_a(String)).returns(mock_file_obj) 
 
+0

Evet, bir alay kitaplığı kullanmamayı tercih ederim. Ruby'ye gerçekten ihtiyacın var mı? – auramo

+3

Alaycı bir kütüphaneye ilgimden kaçınma gereği duymuyorum. Mocha sadece sizin için yaptığınız meta programlamayı (yani yöntemleri geçersiz kılmayı) yapıyor. –

+0

@BrianPhillips Saptanan yöntemlerin –

1

Ana hatlarıyla belirttiğiniz durumda, yaptığınız şeyin iyi görünmesini öneririm. James Mead'in (Mocha'nın yazarı) savunduğu bir teknik olduğunu biliyorum. Sadece bunun için metaprogramlama yapmaya gerek yok. Here's what James has to say about it (ve deneyebileceğiniz diğer tekniklerin uzun bir listesi)

1

Bu benim için özellikle zor bir sorundur. this question numaralı telefondan aldığım yardım ve benim adıma biraz daha fazla çalışma ile geldiğim çözüm.

# lib/real_thing.rb 
class RealThing 
    def initialize a, b, c 
    # ... 
    end 
end 

# test/test_real_thing.rb 
class TestRealThing < MiniTest::Unit::TestCase 

    class Fake < RealThing; end 

    def test_real_thing_initializer 
    fake = mock() 
    Fake.expects(:new).with(1, 2, 3).returns(fake) 
    assert_equal fake, Fake.new(1, 2, 3) 
    end 

end 
İlgili konular