2014-09-04 16 views
13

Projemi Django 1.7 kullanmaya yönlendirmeye çalışıyorum. 1 şey hariç her şey yolunda. Testler içindeki modeller klasörler.Modeller testlerde - Django 1.7 issue

Django 1.7 yeni geçişleri dahili olarak göç komutunu çalıştırır. Syncdb çalıştırılmadan önce. Bu, bir modelin geçişlere dahil edilmemesi durumunda, DB'ye (ve ayrıca DB'yi test etmeye) alınmaz. Tam şu anda deneyimlediğim şey bu.

Ne yapmam geçerli:

Benim /app/tests/models.py yılında

Ben kukla modeli vardır: Bütün yaptığı bir soyutBaseImage modelinden miras kalacak class TestBaseImage(BaseImage): pass .

Daha sonra testlerde, bunu test etmek için bu modelin örneklerini yaratıyorum. Sorun, daha fazla çalışmadığıdır. Göçmenlere dahil edilmemiştir (test modellerini üretim DB'sinde tutmak istemediğimden bellidir). Testlerimi yürütmek, table does not exist numaralı telefonun DB hatası verdiğini söylüyor. Bu, geçişlere dahil olmadığı için mantıklı.

Yeni geçiş sistemleriyle çalışmasını sağlamanın bir yolu var mı? Bunu düzeltmek için bir yol bulamıyorum.

Kod kullandığım:

app/test/models.py

from ..models import BaseImage 


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

uygulama/models.py

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

fabrikaları:

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


class PortImageFactory(BaseImageFactory): 
    FACTORY_FOR = PortImage 

örnek testi: Eğer tests.py ayrıştırarak yapabilirsiniz

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

Testlerde yeni bir model oluşturdum ve bunun örneklerini oluşturdum, ancak hiç bir hata alamıyorum. – ChillarAnand

+0

@ChillarAnand Bazı kodları ekledim. Bunu Django 1.7 ve güney kapatmayı kullanarak yaptın mı? Hala bir tablo mevcut değil:/ – tunarob

+0

Sizin nesneniz alay edilmemeli ve böyle tanımlanmamalıdır? – aRkadeFR

cevap

5

, test sadece modelleri Çözüm olarak

here yapmak için bir yol isteyen bir bilet var bir Uygulamanın.

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

Böyle bir şey ile sona erecek:

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

Sonra eklemek gerekir senin INSTALLED_APPS

INSTALLED_APPS = (
    # ... 
    'myapp', 
    'myapp.tests', 
) 
Muhtemelen üretimde myapp.tests yüklemek istemiyorum

, Böylece ayrı ayar dosyalarını saklayabilirsiniz. Böyle bir şey:

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

try: 
    from local_settings import * 
except ImportError: 
    pass 

Ya da daha iyisi, bir test koşucu oluşturup oraya testleri yükleyin.

Son olarak, python manage.py makemigrations

+0

Bu çözüm, test modelinin üretim veritabanında bir tablo olarak var olmasına neden olabilir, doğru mu? Bu kabul edilemez. – Rico

+3

Hayır, yanıt, test modelinin üretimde oluşturulmasını önlemek için, test ve prod için ayrı ayar dosyalarını kullanacağını gösterir. –

3

İşte iş gibi görünüyor bir çözüm var çalıştırmayı unutmayın. Taşıma çerçevenizi, uygulamanız için hiç geçiş olmadığını düşünerek kandırın. settings.py yılında:

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' 
    } 

Ben first post in ths Django dev mailing list thread üzerinde fikir buldu ve o da şu anda Django itself daha kullanıldığı, ancak göçler gereklidir ve "syncdb geri dönüş" kaldırılır Django gelecekteki sürümlerinde çalışmayabilir.