2012-07-03 27 views
8

Ben okur Raylar kod parçasını test ediyorum Rails ne kullanıyor? çağırarak, benim RSpec testlerde</p> <pre><code>sleep(10.0) </code></pre> <p>:

Kernel.should_receive(:sleep).exactly(1).time 

başarısız ve test on saniye boyunca uyudu. Bu bana Rails programındaki sleep()'un Kernel.sleep() numaralı telefonu aramadığı sonucuna götürdü. Benim RSpec testleri geçti (ve test uyuyamadım), bundan sonra

Kernel.sleep(10.0) 

...: Ben benim Raylar kodunu değiştirerek bunu doğruladı.

Bu spesifik ve genel soruya yol açar:

  • uykunun hangi uygulama() Raylar kullanıyor (Ruby 1.9.3/Rails 3.2.1 koşuyorum)?
  • Tercümandan, herhangi bir işlev için kaynak kodunu bulmanın en kolay yolu nedir?
+0

Yakut api içinde bulabildiğim diğer 'uyku 'yöntemi' Mutex # sleep'tir, bu yüzden olabilir: http://apidock.com/ruby/Mutex/sleep – Frost

+1

Eğer sormak istersen İki soru, iki soru sormalısın. İkinci soruya cevabımdaki cevabı göz ardı etmeyi tercih ettim, çünkü StackOverflow üzerinde birkaç kez sorulmuş ve cevaplanmıştır. –

+0

Jorg: Yah, İki soruyu sormanın tehlikelerinin farkındaydım! Teşekkürler ... –

cevap

8

Açık bir alıcı belirtmediğinizde, örtülü alıcı self, Kernel değil. (Neden böyle düşünürsünüz?)

sleep(10.0) 

kabaca

self.sleep(10.0) 

ve değil aynıdır

Yani, yani hepsi aynı

olarak
Kernel.sleep(10.0) 

de Kernel#sleep'u self numaralı telefondan arıyor venumaralı telefondan değil.. Bu, hangi yöntemde self'un ne olduğuna dair bir beklenti ayarlamanız gerektiği anlamına gelir.

+0

Doh. Tabii ki. Bu, testi daha da zorlaştırır, çünkü uyku() birkaç kat aşağı olabilir ve söz konusu "kendini" kolayca erişilebilir değildir. Benim çözümüm - en uygun değil - Kernel.sleep() işlevini açıkça çağırmak için kaynak kodunu değiştirmek oldu. –

+0

"Kernel # sleep" ya da bir defadan fazla çağrılırsa veya 10.0'dan farklı bir argüman ile bir istisna oluşturmak için yama ekleyebilirdiniz ve ardından istisna kaldırılmadığını iddia edebilirsiniz. Ya da, "Kernel" adlı maymun yama yerine, "self" in ne olduğuyla ilgili bir şey yapamazsınız. –

+0

Ama gerçekten, yanlış şeyi veya yanlış seviyeyi test ediyormuşsunuz gibi görünüyor. Üzerinde bir beklenti oluşturmak için neden nesneye referans alamıyorsunuz? Gerçekleştirmek istediğiniz * gerçek * davranış nedir ve siz * belirli bir davranışın "uyku (10.0)" veya iki kez "uyku (5,0)" çağrısıyla elde edilip edilmediğine dikkat edin? –

İlgili konular