Юнит-тестирование Django в Visual Studio 2017 или 2019: - PullRequest
0 голосов
/ 08 декабря 2018

Django нужен установочный код, чтобы работали модульные тесты на моделях, которым нужна база данных.Стандартный модульный тест Django делает это в фоновом режиме, но не в Visual Studio.Я не нашел хорошего способа предоставить установочный код, который будет работать для запуска тестов из Visual Studio Test Explorer и с django manage.py test.Visual Studio Test Explorer не вызывает ни setUpModule / tearDownModule, ни tearDownClass.Следующий код работает изнутри VS, но я нахожу его уродливым, И он не работает с носом / 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()

Когда запускается VS Test Explorer, вывод будет

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

Так что это не рушится через мои функции / методы.Я не могу вставить django.setup () в setUpClass, потому что импорт модели уже требует настройки django.Я бы тоже не хотел, потому что я хочу создать тестовую базу данных только один раз, а не повторно для всех тестовых классов.Я не могу не думать, что делаю это совершенно неправильно ...

...