django unit tests without a db

前端 未结 11 1515
醉梦人生
醉梦人生 2020-11-29 16:11

Is there a possibility to write django unittests without setting up a db? I want to test business logic which doesn\'t require the db to set up. And while it is fast to setu

11条回答
  •  夕颜
    夕颜 (楼主)
    2020-11-29 17:00

    Another solution not mentioned: this was easy for me to implement because I already have multiple settings files (for local / staging / production) that inherit from base.py . So unlike other people I did not have to overwrite DATABASES['default'], as DATABASES isn't set in base.py

    SimpleTestCase still tried to connect to my test database and run migrations. When I made a config/settings/test.py file that didn't set DATABASES to anything, then my unit tests ran without it. It allowed me to use models that had foreign key and unique constraint fields. (Reverse foreign key lookup, which requires a db lookup, fails.)

    (Django 2.0.6)

    PS code snippets

    PROJECT_ROOT_DIR/config/settings/test.py:
    from .base import *
    #other test settings
    
    #DATABASES = {
    # 'default': {
    #   'ENGINE': 'django.db.backends.sqlite3',
    #   'NAME': 'PROJECT_ROOT_DIR/db.sqlite3',
    # }
    #}
    
    cli, run from PROJECT_ROOT_DIR:
    ./manage.py test path.to.app.test --settings config.settings.test
    
    path/to/app/test.py:
    from django.test import SimpleTestCase
    from .models import *
    #^assume models.py imports User and defines Classified and UpgradePrice
    
    class TestCaseWorkingTest(SimpleTestCase):
      def test_case_working(self):
        self.assertTrue(True)
      def test_models_ok(self):
        obj = UpgradePrice(title='test',price=1.00)
        self.assertEqual(obj.title,'test')
      def test_more_complex_model(self):
        user = User(username='testuser',email='hi@hey.com')
        self.assertEqual(user.username,'testuser')
      def test_foreign_key(self):
        user = User(username='testuser',email='hi@hey.com')
        ad = Classified(user=user,headline='headline',body='body')
        self.assertEqual(ad.user.username,'testuser')
      #fails with error:
      def test_reverse_foreign_key(self):
        user = User(username='testuser',email='hi@hey.com')
        ad = Classified(user=user,headline='headline',body='body')
        print(user.classified_set.first())
        self.assertTrue(True) #throws exception and never gets here
    

提交回复
热议问题