2015-09-21 27 views
8

Kısa bir süre önce Django 1.8.4 sürümüne yükselttiğim bir Django uygulamasına sahibim. Test koşum için 200'den fazla entegrasyon ve birim testi yapmak için burun 1.3.7 ve django-burun 1.4.1 kullanıyorum. Django ve burun hem geçişten bu yana, benim testlerin 12 aynı hata ile başarısız buluyorum:Django 1.8 ve burun: çelişen modeller?

====================================================================== 
ERROR: Failure: RuntimeError (Conflicting 'c' models in application 'nose': <class 'account.tests.form_tests.TestAddress'> and <class 'nose.util.C'>.) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "/Users/me/venv/myproj/lib/python2.7/site-packages/nose/loader.py", line 523, in makeTest 
    return self._makeTest(obj, parent) 
    File "/Users/me/venv/myproj/lib/python2.7/site-packages/nose/loader.py", line 568, in _makeTest 
    obj = transplant_class(obj, parent.__name__) 
    File "/Users/me/venv/myproj/lib/python2.7/site-packages/nose/util.py", line 644, in transplant_class 
    class C(cls): 
    File "/Users/me/venv/myproj/lib/python2.7/site-packages/django/db/models/base.py", line 311, in __new__ 
    new_class._meta.apps.register_model(new_class._meta.app_label, new_class) 
    File "/Users/me/venv/myproj/lib/python2.7/site-packages/django/apps/registry.py", line 223, in register_model 
    (model_name, app_label, app_models[model_name], model)) 
RuntimeError: Conflicting 'c' models in application 'nose': <class 'account.tests.form_tests.TestAddress'> and <class 'nose.util.C'>. 

Ne meraklı form_tests.py modülü bile aslında içinde bir sınıftır TestAddress başvuru olmamasıdır benim "profiller" modeli:

# myprof/profile/models.py 
class TestAddress(models.Model): 
    user = models.OneToOneField(User, primary_key=True, unique=True) 
    address_line_1 = models.CharField(max_length=30) 
    address_line_2 = models.CharField(max_length=30, null=True, blank=True) 
    city = models.CharField(max_length=30) 
    region = models.CharField(max_length=30, null=True, blank=True) 
    postal_code = models.CharField(max_length=10, null=True, blank=True) 
    country = models.ForeignKey('Country') 

    class Meta: 
     db_table = 'test_address' 

    def __unicode__(self): 
     return u'%s' % (self.user.username) 

benim testler TestAddress sınıfının bir örneğini oluşturmak gerekiyor, ben bir factory_boy kullanmak (v 2.5.2.) fabrika: Ben breakpointler

# utils/factories.py 
from profile.models import TestAddress 

class UserFactory(factory.django.DjangoModelFactory): 
class Meta: 
    model = User 
username = 'testuser' 

class TestAddressFactory(factory.django.DjangoModelFactory): 
    class Meta: 
     model = TestAddress 
    user = factory.SubFactory('utils.factories.UserFactory') 
    address_line_1 = '123 Main St.' 
    address_line_2 = 'Apt. A' 
    city = 'AnyCity' 
    region = 'AnyRegion' 
    postal_code = '12345' 
    country = factory.SubFactory('utils.factories.CountryFactory') 

burun loader.py modülünde ve yükleyicinin "profile.models" içinde "TestAddress" değerini gördüğünü doğruladı. Ancak, orada "account.tests.model_tests" olarak ayarlanmış bir "parent .__ name__" değişkeni var. Ben birkaç soru var:

1. Why is this occurring? 
2. Is there a way I can fix it? 
3. Is there some way I can get nose to tell me which tests are resulting in these runtime errors so that I can at least disable them if I can't fix the problem? 

ben "--verbosity = 2" set ama bu başarısız testlerin isimlerini göstermez. Burun doktorlarına baktım ve hiçbir şey görmedim. En kötü durumda, her testi tek tek çağırmak için bir komut dosyası yazabilirim ve test adını çalmadan önce yankılanabilirim ama bu çok çirkin ve zaman alıcı görünüyor.

Teşekkürler.

cevap

0

Django projemi 1.6'dan 1.8'e ve django burnunu 1.4.3'e güncelleştirirken aynı soruna rastladım.

Yeni DiscoverRunner itibaren 1.7 kullanılan ile, django-burun girişimleri onlar test modülleri karşılaşılan önce onları django-burnun Django app içine adapte edilen yol açan test Cases olarak Test* ile başlayan tüm sınıfları çalıştırmak için görünür .

Bu adlandırma düzenini önlemek için, bu soruyu AdressTestModel gibi şeylere yeniden adlandırarak bu sorunu çözmeyi başardım.

0

Bu sorunla yeni karşılaştım ve @nottest dekoratörüyle çözdüm.

Teknik olarak docs göre fonksiyonları için, ama onunla dekorasyon sınıfları da çalışır:

from nose.tools import nottest             
@nottest 
class TestAddressFactory(...): 
    ... 

Tüm dekoratör o dekore edilir nesneye değer True ile __test__ eklemek etmez.

def nottest(func): 
    """Decorator to mark a function or method as *not* a test 
    """ 
    func.__test__ = False 
    return func 
İlgili konular