2016-07-15 10 views
6

मेरी समस्या यह है कि मैं अपने विकास डेटाबेस से अलग एक अलग परीक्षण डेटाबेस रखना चाहता था। ऐप स्वयं डीजेगो-रेस्ट-फ्रेमवर्क त्वरित-प्रारंभ ट्यूटोरियल के लगभग समान है, बस मैं एलडीएपी बैकएंड का उपयोग करता हूं। मेरा विकास डेटाबेस MySQL का उपयोग करता है। मेरे पास परीक्षण के लिए अलग सेटिंग्स फ़ाइल है।अलग डेटाबेस पर Django परीक्षण "ऑपरेशनल एरर: ऐसी कोई तालिका नहीं: auth_user"

पूर्ण त्रुटि ट्रैस बैक मैं यहाँ में डाल: http://dpaste.com/1W3TX1E, लेकिन दिलचस्प हिस्सा है:

sqlite3.OperationalError: no such table: auth_user 

पूर्ण परीक्षण सेटिंग्स यहां हैं: http://dpaste.com/1K7KHK4। मेरे संबंधित सेटिंग कर रहे हैं (pyldap और Django-ldap प्रमाणीकरण इंस्टॉल किए गए एप्लिकेशन से याद कर रहे हैं, वे पिप के साथ मैन्युअल रूप से स्थापित कर रहे हैं):

INSTALLED_APPS = [ 
    'django.contrib.admin', 
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
    'rest_framework', 
    'njord', 
    'permissions', 
] 
DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.sqlite3', 
     'NAME': ':memory:', 
    } 
} 

अभी एप्लिकेशन मूल रूप से एलडीएपी के साथ ही प्रमाणीकरण करता है। मुझे लगता है कि यही कारण है कि मुझे एक त्रुटि है - जब मैं परीक्षण करता हूं तो मेरे डेटाबेस में कुछ भी नहीं है - कोई उपयोगकर्ता नहीं, कोई समूह नहीं। यदि उपयोगकर्ता को एलडीएपी सर्वर के खिलाफ प्रमाणित किया जाता है, तो उपयोगकर्ता डेटाबेस में सभी समूहों के साथ बनाया जाता है, इसलिए यह मांग पर होता है।

क्या काम करता है: मेरे ऐप का विकास संस्करण बाह्य एलडीएपी के खिलाफ अच्छी तरह से काम करता है और विकास डेटाबेस के साथ कार्यों का परीक्षण भी करता है।

क्या काम नहीं करता है: sqllite3 इन-मेमोरी डेटाबेस (मैं दोहराता हूं, विकास डेटाबेस के साथ परीक्षण और मैक किए गए ldap कार्यों के साथ परीक्षण)।

कोड के साथ मैं परीक्षण यहाँ है:

from django.test import TestCase, Client 
import django 
import ldap 

from mockldap import MockLdap 

class AuthenticationTests(TestCase): 
    """ 
    Set Up the structure (Accounts, Groups) and try authentication 
    """ 
    # Top level hierarchy 
    top = ('dc=ee', {'dc': ['ee']}) 
    test = ('dc=test,dc=ee', {'dc': ['test']}) 

    # Top level groups 
    people = ('ou=people,dc=test,dc=ee', {'ou': ['people'], 'objectClass': ['organizationalUnit', 'top']}) 
    groups = ('ou=groups,dc=test,dc=ee', {'ou': ['groups'], 'objectClass': ['organizationalUnit', 'top']}) 

    # Groups 
    admins = ('cn=admins,ou=groups,dc=test,dc=ee', {'cn': ['admins'], 'memberUid': ['admin'], 
               'objectClass': ['sambaGroupMapping', 'posixGroup', 'top'], 
               'gidNumber': ['1']}) 

    group1 = ('cn=group1,ou=groups,dc=test,dc=ee', {'cn': ['group1'], 
               'memberUid': ['alice', 'bob'], 
             'objectClass': ['sambaGroupMapping', 'posixGroup', 'top']}) 

    group2 = ('cn=group2,ou=groups,dc=test,dc=ee', {'cn': ['group2'], 'memberUid': ['admin', 'bob', 'karl'], 
             'objectClass': ['sambaGroupMapping', 'posixGroup', 'top']}) 

    # Users 
    admin = ('uid=admin,ou=people,dc=test,dc=ee', {'uid': ['admin'], 'userPassword': ['ldaptest'], 'sn': ['Joe'], 
               'cn': ['Admin Joe'], 'mail': ['[email protected]'], 
               'givenName': ['Admin'], 'objectClass': 
                ['top', 'person', 'posixAccount', 'shadowAccount', 
                'inetOrgPerson', 'sambaSamAccount']}) 

    alice = ('uid=alice,ou=people,dc=test,dc=ee', {'uid': ['alice'], 'userPassword': ['ldaptest'], 'sn': ['Cooper'], 
               'cn': ['Alice Cooper'], 'mail': ['[email protected]'], 
               'givenName': ['Alice'], 'objectClass': 
                ['top', 'person', 'posixAccount', 'shadowAccount', 
                'inetOrgPerson', 'sambaSamAccount']}) 

    bob = ('uid=bob,ou=people,dc=test,dc=ee', {'uid': ['bob'], 'userPassword': ['ldaptest'], 'sn': ['Marley'], 
              'cn': ['Bob Marley'], 'mail': ['[email protected]'], 
              'givenName': ['Bob'], 'objectClass': 
               ['top', 'person', 'posixAccount', 'shadowAccount', 
               'inetOrgPerson', 'sambaSamAccount']}) 

    karl = ('uid=karl,ou=people,dc=test,dc=ee', {'uid': ['karl'], 'userPassword': ['ldaptest'], 'sn': ['Suur'], 
              'cn': ['Karl Suur'], 'mail': ['[email protected]'], 
              'givenName': ['Karl'], 'objectClass': 
               ['top', 'person', 'posixAccount', 'shadowAccount', 
                'inetOrgPerson', 'sambaSamAccount']}) 

    # This is the content of our mock LDAP directory. It takes the form 
    # {dn: {attr: [value, ...], ...}, ...}. 
    directory = dict([top, test, people, groups, admins, group1, group2, admin, alice, bob, karl]) 

    @classmethod 
    def setUpTestData(cls): 
     # We only need to create the MockLdap instance once. The content we 
     # pass in will be used for all LDAP connections. 
     cls.mockldap = MockLdap(cls.directory) 

    @classmethod 
    def tearDownClass(cls): 
     del cls.mockldap 

    def setUp(self): 
     # Patch ldap.initialize 
     django.setup() 
     self.mockldap.start() 
     self.ldapobj = self.mockldap['ldap://localhost/'] 

    def tearDown(self): 
     # Stop patching ldap.initialize and reset state. 
     self.mockldap.stop() 
     del self.ldapobj 

    def test_some_basic_mockldap_auth(self): 
     searchStr = 'uid=alice,ou=people,dc=test,dc=ee' 
     results = _do_simple_ldap_search(searchStr) 
     ldapName = results[0][0] 
     ldapPropDict = results[0][1] 
     self.assertEqual(searchStr, ldapName) 
     self.assertEqual(len(ldapPropDict), 7) 

    def test_index_visible_for_all(self): 
     c = Client() 
     response = c.get("/") 
     self.assertContains(response, "https://stackoverflow.com/users/", 1) 
     self.assertContains(response, "/groups/", 1) 

    def test_login(self): 
     c = Client() 
     response = c.post("/api-auth/login/", {'username': 'bob', 'password': 'ldaptest'}) 
     print(response.status_code) 
     response = c.get("https://stackoverflow.com/users/") 
     print(response._container) 

def _do_simple_ldap_search(searchStr): 
    conn = ldap.initialize('ldap://localhost/') 
    conn.simple_bind_s(searchStr, 'ldaptest') 
    results = conn.search_s(searchStr, ldap.SCOPE_SUBTREE,) 

    return results 

कोड भी यहाँ उपलब्ध: http://dpaste.com/3D2H4NK (वाक्यविन्यास उजागर)।

मुझे यकीन नहीं है, समस्या क्या है। केवल एक चीज जिसे मैं सोच सकता हूं वह यह है कि सृजन में डेटाबेस में कोई उपयोगकर्ता नहीं है, डेटाबेस नहीं बनाया गया है, लेकिन मुझे यकीन नहीं है। किसी भी प्रकार की मदद की बेहद सराहना की जाती है।

मैंने सभी माइग्रेशन किए हैं।

(venv)[email protected]:~/workspace/fileshare/njord$ python manage.py showmigrationsadmin 
[X] 0001_initial 
[X] 0002_logentry_remove_auto_add 
auth 
[X] 0001_initial 
[X] 0002_alter_permission_name_max_length 
[X] 0003_alter_user_email_max_length 
[X] 0004_alter_user_username_opts 
[X] 0005_alter_user_last_login_null 
[X] 0006_require_contenttypes_0002 
[X] 0007_alter_validators_add_error_messages 
contenttypes 
[X] 0001_initial 
[X] 0002_remove_content_type_name 
sessions 
[X] 0001_initial 
(venv)[email protected]:~/workspace/fileshare/njord$ python manage.py makemigrationsNo changes detected 
(venv)[email protected]:~/workspace/fileshare/njord$ python manage.py migrate 
Operations to perform: 
    Apply all migrations: admin, sessions, auth, contenttypes 
Running migrations: 
    No migrations to apply. 

उत्तर

0

क्या किया जाना था से समाधान नहीं मिला इन लाइनों को जोड़ने manage.py था:

if __name__ == "__main__": 
    if 'test' in sys.argv: 
     os.environ.setdefault("DJANGO_SETTINGS_MODULE", "app.test_settings") 
    else: 
     os.environ.setdefault("DJANGO_SETTINGS_MODULE", "app.settings") 

जोड़ने के बाद यह है कि अगर 'परीक्षण' manage.py की मुख्य विधि करने के लिए बात है, ऐप सही ढंग से काम करना शुरू कर दिया, उस पायथन प्रबंधन.py परीक्षण के बाद और python manage.py रनरवर दोनों सही सेटिंग्स के साथ काम किया।

हालांकि, मुझे यह PyCharm के साथ काम करने और इसे अभी परीक्षण करने के लिए नहीं मिला है, इसे कैसे काम पर लाया जाए।

0

रन

INSTALLED_APPS में प्रत्येक अनुप्रयोगों के लिए । (विशेष रूप से क्षुधा auth_user पर एक ForeignKey क्षेत्र है)

मैं मुझे यहाँ प्राप्त करने के लिए अलग त्रुटि है, लेकिन लगता है कि कारण एक ही है ।
django.db.utils.OperationalError: (1005, "Can't create table '<test_db>.#sql-3821_1c9' (errno: 150)")

दोनों ही मामलों में सभी auth मॉड्यूल से संबंधित टेबल केवल, जब परीक्षण makemigrations आदेश को क्रियान्वित करने के बिना नहीं बन जाते हैं।
मैं, here

संबंधित मुद्दे