2016-07-15 30 views
6

Moim problemem jest to, że chciałem stworzyć oddzielną bazę testową, oddzieloną od mojej bazy danych programistycznych. Sama aplikacja jest prawie identyczna z samouczkiem szybkiego uruchamiania Django-Rest-Framework, tylko że używam backendu LDAP. Moja baza danych programowania używa MySQL. Mam osobny plik ustawień do testowania.Testowanie Django w oddzielnej bazie danych z napisem "OperationalError: no such table: auth_user"

Pełna błąd traceback kładę tutaj: http://dpaste.com/1W3TX1E, ale ciekawe jest to:

sqlite3.OperationalError: no such table: auth_user 

pełny test-settings tutaj: http://dpaste.com/1K7KHK4. Moje ustawienia są powiązane (pyldap i django-ldap-auth brakuje zainstalowanych aplikacji, są one zainstalowane ręcznie z PIP):

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

Teraz aplikacja działa w zasadzie tylko z uwierzytelniania LDAP. Myślę, że właśnie dlatego mam błąd - kiedy robię testy, nie mam nic w mojej bazie danych - żadnych użytkowników, żadnych grup. Jeśli użytkownik jest uwierzytelniany na serwerze LDAP, użytkownik jest tworzony w bazie danych wraz ze wszystkimi grupami, w których się znajduje, tak więc dzieje się to na żądanie.

Co działa: Wersja rozwojowa mojej aplikacji działa dobrze przeciwko zewnętrznemu protokołowi LDAP, a także testuje pracę z programistyczną bazą danych.

Co nie działa: Testowanie za pomocą bazy danych sqllite3 w pamięci (powtarzam, testowanie za pomocą programistycznej bazy danych i wyśmiewanych prac Ldap).

Kod przetestować ze jest tutaj:

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 

Kod także dostępny tutaj: http://dpaste.com/3D2H4NK (podświetlanie składni).

Nie jestem pewien, jaki jest problem. Jedyne o czym mogę pomyśleć to to, że ponieważ nie ma użytkowników w bazie danych podczas tworzenia, baza danych nie jest tworzona, ale nie jestem pewien. Każda pomoc jest doceniana.

Zrobiłem wszystkie migracje.

(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. 

Odpowiedz

0

Co trzeba było zrobić, to dodać te linie do 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") 

Po dodając, że jeśli 'test' rzeczą główną metodą manage.py, aplikacja zaczęła działać poprawnie, po tym, że python manage.py test i python manage.py runserver zarówno działały z poprawnymi ustawieniami.

Jednak nie mam tego do pracy z PyCharm i przetestowania go teraz, jak zmusić go do działania.

0

run

dla każdej aplikacji w INSTALLED_APPS. (Specjalnie aplikacje, które posiada ForeignKey pola na auth_user)

Mam inny błąd, żeby mnie tutaj, ale myślę że przyczyna jest taka sama .
django.db.utils.OperationalError: (1005, "Can't create table '<test_db>.#sql-3821_1c9' (errno: 150)")

W obu przypadkach wszystkie tabele powiązane z modułem auth tylko nie są tworzone podczas testowania, bez wykonywania polecenia makemigrations.
znalazłem rozwiązanie z here