2015-01-07 45 views
1

當我運行單元測試時,Django 1.6似乎沒有創建一個空白數據庫來測試,我不明白爲什麼。 Django docs表示Django不使用您的生產數據庫,而是創建一個單獨的空白數據庫進行測試。但是,當我調試我的測試'test_get_user_ids'並運行命令'UserProxy.objects.all()'時,我看到了生產數據庫中的所有用戶。現在我明白了,這個特定的測試會失敗,因爲我沒有將每個UserProxy實例保存到數據庫,因此也不會生成測試的id。但事實是,當我查詢UserProxy時,我仍然可以看到我生產數據庫中的所有用戶,我希望它們是空的。這是爲什麼發生?爲什麼Django在測試期間不創建空白數據庫?

BTW,我正在使用nosetest測試: 「nosetests -s apps.profile.tests.model_tests.py:UserProxyUT」

感謝。

# settings.py 
DATABASES = { 
    'default': { 
     # Enable PostGIS extensions 
     'ENGINE' : 'django.contrib.gis.db.backends.postgis', 
     'NAME' : 'myapp', 
     'USER' : 'myappuser', 
     'PASSWORD': 'myapppw', 
     'HOST' : 'localhost', 
     'PORT' : '', 
    } 
} 

# apps/profile/models.py 
from django.contrib.auth.models import User 

class UserProxy(User): 
    """Proxy for the auth.models User class.""" 
    class Meta: 
     proxy = True 

    @staticmethod 
     def get_user_ids(usernames): 
      """Return the user ID of each username in a list.""" 
      user_ids = [] 
      for name in usernames: 
       try: 
        u = User.objects.get(username__exact=name) 
        user_ids.append(u.id) 
       except ObjectDoesNotExist: 
        logger.error("We were unable to find '%s' in a list of usernames." % name) 
      return user_ids 

# apps/profile/tests/model_tests.py 
from django.contrib.auth.models import User 
from django.test import TestCase 
from apps.profile.models import UserProxy 

class UserProxyUT(TestCase): 
    def test_get_user_ids(self): 
     debug() 
     # UserProxy.objects.all() shows usernames from my production database! 
     u1 = UserProxy(username='user1') 
     u2 = UserProxy(username='user2') 
     u3 = UserProxy(username='user3') 
     usernames = [u1, u2, u3] 
     expected = [u1.id, u2.id, u3.id] 
     actual = UserProxy.get_user_ids(usernames) 
     self.assertEqual(expected, actual) 
+0

你確定你沒有存儲爲一個固定的生產DB數據? –

+0

同時顯示'DATABASES'設定值。謝謝。 – alecxe

+0

@alecxe,對不起。所示。 – William

回答

1

我要帶刺,說其因爲你使用nosetests而不是Django的測試運行。因爲您使用的是nosetests,Django的setup_test_environment未被調用,這意味着代碼不知道要正確使用測試數據庫。

下面是shoudl幫助Django文檔的相關部分:

Finding data from your production database when running tests?

如果你的代碼試圖當它的模塊編譯訪問數據庫,之前測試數據庫是這將發生設置,可能會有意想不到的結果。例如,如果您在模塊級代碼中存在數據庫查詢並且存在真實數據庫,則生產數據可能會污染您的測試。無論如何,在你的代碼中有這樣的導入時間數據庫查詢是一個糟糕的主意 - 重寫你的代碼,以便它不這樣做。

和:

Running tests outside the test runner

如果你想./manage.py測試外運行測試 - 例如,在shell提示 - 你需要設置測試環境第一。 Django提供了一個方便的方法來做到這一點:

>>> from django.test.utils import setup_test_environment 
>>> setup_test_environment() 
+1

請注意,'django_nose'包應該在這裏使用。 – alecxe

相關問題