我想了解一些关于测试数据提供的最佳实践问题。
从文档中获取。
from django.test import TestCase
from myapp.models import Animal
class AnimalTestCase(TestCase):
def setUp(self):
Animal.objects.create(name="lion", sound="roar")
Animal.objects.create(name="cat", sound="meow")
def test_animals_can_speak(self):
"""Animals that can speak are correctly identified"""
lion = Animal.objects.get(name="lion")
cat = Animal.objects.get(name="cat")
与上面的示例相似,我想在测试用例的
setUp
方法中保存一些模型,以便稍后在特定的测试用例中使用。我当然可以为此提供一个json fixture,但这次我希望通过代码创建模型以保证透明度,因为数量很少。根据文档,当我使用
django.test.TestCase
时,每个单独的测试都在事务中运行。但是我的setUp()
中没有任何数据存在于数据库中。我在调试器中运行并连接到临时数据库,并进行了检查。当使用
django.utils.unittest.TestCase
时,数据存在。但是,该方法由于在每个单独的测试中运行而“聚合数据”。我理解为什么
unittest.TestCase
会聚合数据,因为它不清除数据库。但是我不理解为什么使用django.test.TestCase
时数据不存在。即使在setUp()
方法的结尾,它仍然是空白的。
django.test.TestCase
不应该保存任何数据吗?还是我做错了什么?编辑1:创建了一个干净的项目,它开始按照我的预期工作。对于每个单独的运行,
django.test.TestCase
将数据库填充了setup()
方法中的数据,因此我猜我的设置必须有某些问题。我将应用奥卡姆剃刀原理,看看能否找出是什么问题。编辑2:清除了模型和测试文件,并再次运行了测试。将调试器设置为在
setUp()
之后停止,但数据库中仍然没有任何内容。对象确实具有pk
并且应该保存到数据库中。检查继承到Model
的ModelState
对象,根据adding
属性,它已经保存到了数据库中。在
setUp()
方法中添加了这段调试代码:from django.db import connections
print connections.databases
{'default': {'ENGINE': 'django.db.backends.mysql',
'NAME': 'test_DATABASE_temp', 'TEST_CHARSET': None,
'TEST_COLLATION': None, 'HOST': 'localhost', 'USER': 'user',
'TEST_NAME': None, 'PASSWORD': 'password}
但是当添加:
print Animals.objects.all().count()
2
我收到了回复,确认确实有可用的对象。但是它们在哪里呢?我必须承认,我现在有点痴迷了=)。
我现在可以继续进行,但仍然缺乏一个令人满意的答案。