2009-02-25 20 views
1

Bir JRuby rayları uygulamasında Mocha ve Factory_girl kullanıyorum. Fabrikayı aradığımda, zaten yapılmış olan bir alayla nesneleri iade etmek istiyorum. İşte yapmaya çalıştığım şeyin bir kod snippet'i. Fabrika kızından sahte nesneleri döndürme

Factory.define :tweet_feed_with_tweets, :parent => :tweet_feed do |t| 
    t.expects(:pull_tweets).returns([Factory.build(:status),Factory.build(:status)]) 
end 

Aslında ben ne istiyorum döndürür böylece yöntemi saplama istediğiniz twitter API tutunmak için ünitesini ve fonksiyonel testi istemiyorlar

. Ama bu işe yaramıyor. Nesne herhangi bir saplama yapılmadan geri gelir. Fabrika kızıyla oluşturulmuş bir nesne üzerinde size geri gönderilmeden önce, gerçekte stubbing yapmanın bir yolu var mı? Nesne bloğuna vermiştir gibi factory_girl belgeleri & kaynak kodu baktığımızda

+0

henüz cevap dışarı çalıştınız mı? Cevabım yardım etti mi? –

cevap

1

, bu inşa etmek istediğiniz nesnenin bir Factory değil bir örneği örneğidir (tweet_feed_with_tweets olan (t sizin örnekte,) görünüyor , örneğinizde). Bu,'daki pull_tweets yöntemine yönelik bir beklenti belirlemeninörneğinde Factory örneğinde ayarlanmasını ve Factory(:tweet_feed_with_tweets) numaralı telefonu aradığınızda oluşturulacak nesneye ayarlanmaması anlamına gelir. Bence bu, örneğinin neden beklediğiniz gibi çalışmadığını açıklıyor.

Hatalı olabilirim, ancak Factory.define bloğu içindeki beklentiyi eklemenin bir yolunu göremiyorum. Muhtemelen zaten bu düşünce, ama örneği inşa ettik sonra testinde beklentiyi ekleyerek daha iyi olurdu düşünüyorum ettik: -

def test_should_do_something 
    tweet_feed = Factory(:tweet_feed) 
    tweet_feed.expects(:pull_tweets).returns([Factory.build(:status), Factory.build(:status)]) 
    # test stuff here 
end 

birden çok yerde bu gerekiyorsa, can bir yönteme içine ayıklamak: -

def test_should_do_something 
    tweet_feed = build_tweet_feed_with_tweets 
    # test stuff here 
end 

private 

def build_tweet_feed_with_tweets 
    tweet_feed = Factory(:tweet_feed) 
    tweet_feed.expects(:pull_tweets).returns([Factory.build(:status), Factory.build(:status)]) 
    return tweet_feed 
end 

başka düşünceler bir çift: -

  1. böyle gizli bir uzak bir yerde beklentileri ayarı vardır, herhalde kötü bir fikir olduğunu düşünüyorum.
  2. Eğer bunu yapacaksanız, stubs'un expects'dan daha uygun olduğunu düşünürdüm. pull_tweets yöntemini (ve benzer yöntemlerle) TwitterAPI sınıfına ayırmaya değer olabilir. Bu şekilde, testte TwitterAPI üzerinde bir beklenti ayarlamanız gerekecek kadar kötü görünmeyecektir.

Umarım bunun bir kısmı yardımcı olur.

6

Callbacks artık kullanılabilir:

Factory.define :tweet_feed_with_tweets, :parent => :tweet_feed do |t| 
    t.after_build do |tt| 
    tt.expects(:pull_tweets).returns([Factory.build(:status),Factory.build(:status)]) 
    end 
end