2012-06-08 31 views
3

我正在爲使用django-nose的芹菜任務編寫單元測試。這是相當典型的;一個空白測試數據庫(REUSE_DB = 0),它在測試時間通過夾具進行預填充。django-nose單元測試芹菜任務...缺少數據庫數據

我遇到的問題是,即使TestCase加載夾具,我可以從測試方法中訪問對象,但在異步芹菜任務中執行同樣的查詢失敗。

我已經檢查了settings.DATABASES [「default」] [「name」]在測試方法和被測試任務中都是一樣的。我還驗證了,在作爲常規方法調用調用時,正在測試的任務的行爲正確。

而這就是我不在哪裏的想法。

這裏有一個例子:

class MyTest(TestCase): 
    fixtures = ['test_data.json'] 

    def setUp(self): 
     settings.CELERY_ALWAYS_EAGER = True # seems to be required; if not I get socket errors for Rabbit 
     settings.CELERY_EAGER_PROPAGATES_EXCEPTIONS = True # exposes errors in the code under test. 

    def test_city(self): 
     self.assertIsNotNone(City.objects.get(name='brisbane')) 
     myTask.delay(city_name='brisbane').get() 
     # The following works fine: myTask('brisbane') 

from celery.task import task 

@task() 
def myTask(city_name): 
    c = City.objects.count() # gives 0 
    my_city = City.objects.get(name=city_name) # raises DoesNotExist exception 
    return 
+0

你使用什麼數據庫和芹菜/ django芹菜什麼版本? –

回答

2

這聽起來很像在Django,芹菜2.5的錯誤,這是固定在2.5.2:https://github.com/celery/django-celery/pull/116

錯誤的簡要說明的是,Django的-celery loader正在關閉數據庫連接,然後執行任務甚至是預先執行的任務。由於測試在事務內部運行,因此任務執行的新連接無法看到在setUp中創建的數據。

+1

很好的發現。我正在運行2.5.1 ... :-( –

+0

我對這個bug和它的沮喪非常熟悉,我是提交拉請求的人:) –

+0

想知道如果你有沒有存儲結果的類似問題在測試?現在我可以獲得更新數據庫的熱切任務,但結果記錄(數據庫結果存儲)似乎沒有存儲。我想知道這是否是交易的副作用......是否有任何我應該閱讀/理解的doco? –