Django Unit Testing in Visual Studio 2017 or 2019:
Asked Answered
P

0

4

Django needs setup code so unit tests on models that need a database will work. Standard Django unit test do that silently in the background but not with Visual Studio. I have not found a good way to provide setup code that will work for starting test runs from both the Visual Studio Test Explorer and with django manage.py test. Visual Studio Test Explorer does not call setUpModule/tearDownModule nor tearDownClass. The following code works from within VS, but I find it ugly, AND it doesn't work with nose/django-nose:

import os
import django
import unittest
from django.test.utils import setup_test_environment, teardown_test_environment
from django.test.utils import setup_databases, teardown_databases

try:
    os.environ["DJANGO_SETTINGS_MODULE"] = "config.settings.test"
    setup_test_environment()
    print("Called setup_test_environment()")
    django.setup()
    old_config=setup_databases(1,False)
except:
    old_config=None

def tearDownModule():
    try:
        global old_config
        if old_config:
            teardown_test_environment()
            print("Called teardown_test_environment()")
            teardown_databases(old_config,1,False)
    except:
        pass

from unittest import TestCase # This needs to be called after django.setup 
from konsenser.models import Poll   

class PollTest(TestCase):

    @classmethod
    def setUpClass(cls):
        print("Setting up class")
        return super().setUpClass()

    @classmethod
    def tearDownClass(cls):
        print("Tearing down class")
        return super().setUpClass()


    def setUp(self):
        Poll.objects.create(name='Test Poll', description='for testing')

    def test_content(self):
        poll=Poll.objects.get(id=1)
        name=f'{poll.name}'
        description=f'{poll.description}'
        self.assertDictEqual({'name':name,'description':description },
                             {'name':'Test Poll','description':'for testing'})


if __name__ == '__main__':
    unittest.main()

When run by VS Test Explorer, the output is

Called setup_test_environment()
Creating test database for alias 'default'...
Setting up class

So it doesn't tear down via my functions/methods. I cannot stick django.setup() into setUpClass because the model import needs django setup already. I wouldn't want to either because I want to create the test database just once and not repeatedly for all test classes.

Anbody any insight? I can't help but thinking I am doing this completely wrong...

Pappose answered 8/12, 2018 at 2:17 Comment(1)
Possible duplicate of Visual Studio Test Explorer For Python Django Tests with Database AccessPappose

© 2022 - 2024 — McMap. All rights reserved.