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 设置。我也不想这样做,因为我只想创建一次测试数据库,而不是为所有测试类重复创建。
有人有什么见解吗?我忍不住想我这样做完全错了......