【发布时间】:2013-12-01 09:31:27
【问题描述】:
我想知道一些关于为您的测试提供数据的最佳实践的事情。
来自docs
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 夹具,但这次我宁愿在代码中创建模型以提高透明度,因为它很少。
当我使用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
我得到的响应是实际上有可用的对象。但他们在哪里?我必须承认现在有点痴迷于此=)。
我现在可以继续,但仍然没有令人满意的答案。
【问题讨论】:
标签: django unit-testing testing