2014-09-04 74 views
13

我試圖移植我的項目以使用Django 1.7。除了1件事以外,一切都很好。測試文件夾內的模型。內部測試模型 - Django 1.7問題

Django 1.7新遷移在內部運行migrate命令。在syncdb運行之前。這意味着如果一個模型不包含在遷移中 - 它不會被填充到數據庫(也可用於測試數據庫)。這正是我現在正在經歷的。

我要做的就是:

在我/app/tests/models.py我有假人模型:class TestBaseImage(BaseImage): pass 它所做的是從一個抽象BaseImage模型繼承。

然後在測試中,我創建了虛擬模型的實例來測試它。

問題是,它不再工作。它不包含在遷移中(這很明顯,因爲我不想將我的測試模型保留在生產數據庫中)。運行我的測試會導致數據庫錯誤,說table does not exist。這是有道理的,因爲它不包含在遷移中。

有什麼辦法可以使它與新的遷移系統一起工作嗎?我找不到解決這個問題的方法。

碼我用:

應用程序/測試/ models.py

from ..models import BaseImage 


class TestBaseImage(BaseImage): 
    """Dummy model just to test BaseImage abstract class""" 
    pass 

應用程序/ models.py

class BaseImage(models.Model): 
    # ... fields ... 
    class Meta: 
     abstract = True 

工廠:

class BaseImageFactory(factory.django.DjangoModelFactory): 
    """Factory class for Vessel model""" 
    FACTORY_FOR = BaseImage 
    ABSTRACT_FACTORY = True 


class PortImageFactory(BaseImageFactory): 
    FACTORY_FOR = PortImage 

試驗例:

def get_model_field(model, field_name): 
    """Returns field instance""" 
    return model._meta.get_field_by_name(field_name)[0] 


def test_owner_field(self): 
    """Tests owner field""" 
    field = get_model_field(BaseImage, "owner") 

    self.assertIsInstance(field, models.ForeignKey) 
    self.assertEqual(field.rel.to, get_user_model()) 
+0

我在測試中創建了一個新模型並創建了它的實例,但我沒有收到任何錯誤。 – ChillarAnand 2014-09-04 15:43:46

+0

@ChillarAnand我添加了一些代碼。你用Django 1.7和南方關閉了嗎?我仍然得到表不存在:/ – tunarob 2014-09-04 16:09:21

+0

不應該是你的對象嘲笑,而不是像那樣定義? – aRkadeFR 2014-09-05 08:41:14

回答

5

有請求的方式做只是測試車型here

作爲一種變通方法一票,您可以斷開你的tests.py,並使其成爲應用程序。

tests 
|--migrations 
|--__init__.py 
|--models.py 
|--tests.py 

你最終會像這樣的東西:

myapp 
|-migrations 
|-tests 
|--migrations 
|--__init__.py 
|--models.py 
|--tests.py 
|-__init__.py 
|-models.py 
|-views.py 

那麼你應該把它添加到您的INSTALLED_APPS

INSTALLED_APPS = (
    # ... 
    'myapp', 
    'myapp.tests', 
) 

你可能不希望在生產安裝myapp.tests,所以你可以保留單獨的設置文件。類似這樣的:

INSTALLED_APPS = (
    # ... 
    'myapp', 
) 

try: 
    from local_settings import * 
except ImportError: 
    pass 

或者更好的是,創建一個測試運行器並在那裏安裝測試。

最後但並非最不重要的,記得跑python manage.py makemigrations

+0

該解決方案將導致測試模型在生產數據庫中作爲表格存在,對嗎?這是不可接受的。 – Rico 2014-10-29 17:54:17

+3

不,答案表示使用單獨的設置文件進行測試與產品,以避免在生產中創建測試模型。 – 2014-11-07 18:04:23

3

這裏,似乎工作解決方法。欺騙遷移框架,認爲沒有適用於您的應用程序的遷移。在settings.py

if 'test' in sys.argv: 
    # Only during unittests... 

    # myapp uses a test-only model, which won't be loaded if we only load 
    # our real migration files, so point to a nonexistent one, which will make 
    # the test runner fall back to 'syncdb' behavior. 
    MIGRATION_MODULES = { 
     'myapp': 'myapp.migrations_not_used_in_tests' 
    } 

我發現這個想法在first post in ths Django dev mailing list thread,並且它也是目前在Django itself使用,但它可能不會在需要遷移和「執行syncdb回退」被刪除的Django的未來版本。