2015-09-21 11 views
8

मेरे पास एक Django एप्लिकेशन है जिसे मैंने हाल ही में Django 1.8.4 में अपग्रेड किया है। मैं 200 से अधिक एकीकरण और यूनिट परीक्षण चलाने के लिए अपने परीक्षण धावक के लिए नाक 1.3.7 और django-nose 1.4.1 का उपयोग कर रहा हूं। दोनों Django और नाक अपग्रेड करने के बाद, मैं खोजने कर रहा हूँ कि मेरी परीक्षणों के 12 यह वही त्रुटि के साथ विफल:Django 1.8 और नाक: विरोधाभासी मॉडल?

====================================================================== 
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'>. 

क्या उत्सुक है कि form_tests.py मॉड्यूल भी संदर्भित नहीं करती TestAddress जो वास्तव में एक क्लास के भीतर है मेरी "प्रोफाइल" मॉडल:

# 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) 

मेरी परीक्षण TestAddress वर्ग का एक उदाहरण उत्पन्न करने के लिए की जरूरत है, मैं एक factory_boy का उपयोग (v 2.5.2।) कारखाना:

# 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') 

मैं breakpoints सेट नाक loader.py मॉड्यूल में और पुष्टि की है कि लोडर "profile.models" में "TestAddress" देखता है। हालांकि, वहां "parent.__ name__" वैरिएबल है जो "account.tests.model_tests" पर सेट है। मैं सवालों की एक जोड़ी:

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? 

मैं सेट "--verbosity = 2" लेकिन यह है कि में नाकाम रहने के परीक्षणों के नाम प्रदर्शित नहीं करता। मैंने नाक दस्तावेज़ों को देखा और कुछ भी नहीं देखा। सबसे खराब मामला मैं व्यक्तिगत रूप से प्रत्येक परीक्षण को कॉल करने के लिए एक स्क्रिप्ट लिख सकता हूं और इसे चलाने से पहले परीक्षण नाम को प्रतिबिंबित कर सकता हूं लेकिन यह बहुत बदसूरत और समय लेने वाला लगता है।

धन्यवाद।

उत्तर

0

मैं अपने Django परियोजना को 1.6 से 1.8 तक पोर्ट करते हुए और django-nose को 1.4.3 तक अद्यतन करते समय एक ही समस्या में भाग गया।

ऐसा नहीं है कि के साथ नए DiscoverRunner 1.7 बाद में इस्तेमाल किया, सभी वर्गों के परीक्षण मामलों के रूप में शुरुआत को चलाने के लिए Django-नाक प्रयास Test* साथ है, जो इससे पहले कि वे परीक्षण मॉड्यूल में सामना होता है उन्हें Django-नाक के Django अनुप्रयोग में रूपांतरित किया जा रहा है ओर जाता दिखाई देता है ।

मैंने AdressTestModel जैसी चीज़ों के लिए इस नामकरण योजना से बचने के लिए उन्हें नामित करके इस समस्या को हल करने में कामयाब रहे।

0

मुझे अभी इसका सामना करना पड़ा और इसे @ सबसे सुंदर सजावट के साथ हल किया गया।

तकनीकी तौर पर, यह डॉक्स के अनुसार कार्यों के लिए है, लेकिन यह साथ सजाने कक्षाएं भी काम करता है:

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

सभी डेकोरेटर करता वस्तु यह सजा है करने के लिए मूल्य True साथ __test__ जोड़ने है।

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