How to create table during Django tests with managed = False

前端 未结 9 1868
执笔经年
执笔经年 2020-12-24 12:25

I have a model with managed = False.

class SampleModel(models.Model):
    apple = models.CharField(max_length=30)
    orange = models.CharField(max_length=3         


        
相关标签:
9条回答
  • 2020-12-24 13:03

    Check out this blog post: http://www.caktusgroup.com/blog/2010/09/24/simplifying-the-testing-of-unmanaged-database-models-in-django/ It describes in detail the creation of a test runner for unmanaged models.

    from django.test.simple import DjangoTestSuiteRunner
    
    
    class ManagedModelTestRunner(DjangoTestSuiteRunner):
        """
        Test runner that automatically makes all unmanaged models in your Django
        project managed for the duration of the test run, so that one doesn't need
        to execute the SQL manually to create them.
        """
        def setup_test_environment(self, *args, **kwargs):
            from django.db.models.loading import get_models
            self.unmanaged_models = [m for m in get_models()
                                     if not m._meta.managed]
            for m in self.unmanaged_models:
                m._meta.managed = True
            super(ManagedModelTestRunner, self).setup_test_environment(*args,
                                                                       **kwargs)
    
        def teardown_test_environment(self, *args, **kwargs):
            super(ManagedModelTestRunner, self).teardown_test_environment(*args,
                                                                          **kwargs)
            # reset unmanaged models
            for m in self.unmanaged_models:
                m._meta.managed = False
    
    0 讨论(0)
  • 2020-12-24 13:08

    A quick fix if you don't have many unmanaged tables:

    First add a new variable to the settings.

    # settings.py
    import sys
    UNDER_TEST = (len(sys.argv) > 1 and sys.argv[1] == 'test')
    

    then in the models

    # models.py
    from django.conf import settings
    
    class SampleModel(models.Model):
        apple = models.CharField(max_length=30)
        orange = models.CharField(max_length=30)
    
        class Meta:
            managed = getattr(settings, 'UNDER_TEST', False)
    
    0 讨论(0)
  • 2020-12-24 13:08

    Just to add :django.db.models.loading.get_models will be removed in Django 1.9 (see https://github.com/BertrandBordage/django-cachalot/issues/33).

    Below is an updated one for Django 1.10:

    class UnManagedModelTestRunner(DiscoverRunner):
        '''
        Test runner that automatically makes all unmanaged models in your Django
        project managed for the duration of the test run.
        Many thanks to the Caktus Group 
        '''
    
        def setup_test_environment(self, *args, **kwargs):
            from django.apps  import apps
            self.unmanaged_models = [m for m in apps.get_models() if not m._meta.managed]
            for m in self.unmanaged_models:
                m._meta.managed = True
            super(UnManagedModelTestRunner, self).setup_test_environment(*args, **kwargs)
    
        def teardown_test_environment(self, *args, **kwargs):
            super(UnManagedModelTestRunner, self).teardown_test_environment(*args, **kwargs)
            # reset unmanaged models
            for m in self.unmanaged_models:
                m._meta.managed = False 
    

    Note you also need to take care migrations(see Testing django application with several legacy databases)

    MIGRATION_MODULES = {
        'news': 'news.test_migrations',
        'economist': 'economist.test_migrations'
    }
    
    0 讨论(0)
提交回复
热议问题