2013-08-13 6 views
18

test eder. Temelde Ben doğru şekilde çağrıldığını olduğunu görmek için bir model benim Django app kaydedildiğinde çalıştırılan bir Kereviz görevi yama piton mock kütüphaneyi kullanmaya çalışıyorum

, görev myapp.tasks içine tanımlanır ve böylece gibi benim models.py dosya üstündeki ithal edilmektedir:

from .tasks import mytask

... ve sonra kullanarak modelin iç save() üzerinde çalışır mytask.delay(foo, bar). Şimdiye kadar çok iyi - aslında Celeryd vb. Çalıştırdığımda iyi çalışıyor.

Sadece doğru argümanlarla çağrıldığını kontrol etmek için görevi alay eden bir birim testi oluşturmak istiyorum. Şimdiye kadar Kereviz görevini çalıştırmaya çalış.

Yani deney dosyasında, bir standart TestCase bu içi gibi bir şey var:

from mock import patch # at the top of the file 

# ...then later 
def test_celery_task(self): 
    with patch('myapp.models.mytask.delay') as mock_task: 
     # ...create an instance of the model and save it etc 
     self.assertTrue(mock_task.called) 

... ama çağrılan asla/zaman yanlıştır. Bunun yerine çeşitli enkarnasyonları denedim (myapp.models.mytask yerine ve mock_task.delay'un yerine çağrılıp çağrılmadığını kontrol ettim. Ben sahte yoldan aldığım sahte yollardan derledim, ve googling bana bunun içinde göründüğü gibi olması gerektiğini söylüyor. (Ben doğru anlamak eğer myapp.tasks.mytask.delay yerine myapp.models.mytask.delay olurdu) testlerinde altında modülü.

nerede yanlış burada gidiyorum? Kereviz görevleri yama içinde bazı özel zorluklar var mı? Ben olarak kullanıldığı (celery.task yama Could dekoratör mytask) yerine?

+1

siz "= Gerçek CELERY_ALWAYS_EAGER" ayarı yerine onu alay denediniz mi? – clsung

cevap

21

Yaşadığınız sorun, bunun bir Kereviz görevi olduğuyla alakası yoktur.)

Özellikle, hangi görünümü veya diğer dosya "MyTask" ithal öğrenmenin, oraya yama gerekir, bu nedenle söz konusu hatta şu şekilde görünecektir:

with patch('myapp.myview.mytask.delay') as mock_task: 

için biraz daha fazla lezzet vardır burada:

http://www.voidspace.org.uk/python/mock/patch.html#where-to-patch

+0

Şerefe! Henüz denemedim (proje şu anda durağan) ama yakında bunu deneyecek ve bunu cevaplandı olarak işaretleyecektir. Düşündüğün temanın bir çeşit varyasyonunu denediğimi hatırlıyorum gibi görünüyor, ama tam olarak benim kan şekerinim o anda düşüktü ... :-) – Emil

+1

Aslında bunu tıpkı tam olarak önerdiğim gibi yapıyorum soru kodunda örneklendiği gibi ... işe yaramaz. Oh iyi. – Emil

+0

Soru, modeli yamayor. Modelde "gecikme" kullanmadığınızdan şüphelendiğim gibi yanlış geliyor, ancak başka bir yerde - muhtemelen bir görünüm, dolayısıyla benim yama kodum (biraz) biraz farklı. –

18

@task dekoratör bir Task nesne ile fonksiyonunu (documentation bakınız) yerini alır. Eğer görevin kendisiyle alay ederseniz, bir Task nesnesini MagicMock ile değiştirirsiniz ve bu görev hiç planlanmaz. Bunun yerine, Task nesnenin run() yöntemi ile alay şöyle:

@override_settings(CELERY_ALWAYS_EAGER=True) 
@patch('monitor.tasks.monitor_user.run') 
def test_monitor_all(self, monitor_user): 
    """ 
    Test monitor.all task 
    """ 

    user = ApiUserFactory() 
    tasks.monitor_all.delay() 
    monitor_user.assert_called_once_with(user.key) 
+1

Bu cevabı, kelime kelimesini iki soru üzerine göndermenin bir nedeni var mı? –

+0

Bu sorunun yanı sıra, diğer hakkında oldukça yararlı bilgiler. Tam olarak aynı soru değiller. –

+0

BTW Bir cevabın iki soruyla ilgili olduğunu ve faydalı olduğunu düşünüyorsanız, bunlardan birini kopya olarak işaretleyebilir ve birileri bununla ilgilenecektir. Aynı cevabı göndermek yanlış bir şeydir. –

İlgili konular