首页 > 解决方案 > Visual Studio 2017 或 2019 中的 Django 单元测试:

问题描述

Django 需要设置代码,以便对需要数据库的模型进行单元测试。标准 Django 单元测试在后台静默执行此操作,但不使用 Visual Studio。我还没有找到一种提供设置代码的好方法,该代码可用于从 Visual Studio 测试资源管理器和django manage.py test. Visual Studio 测试资源管理器不会调用 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 设置。我也不想这样做,因为我只想创建一次测试数据库,而不是为所有测试类重复创建。

有人有什么见解吗?我忍不住想我这样做完全错了......

标签: pythondjangovisual-studio-2017django-unittestvisual-studio-2019

解决方案


推荐阅读