Django test.TestCase 与 unittest.TestCase

标签 django unit-testing testing

我想知道关于为您的测试提供数据的最佳实践的一些事情。

来自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 时,每个单独的测试都在事务中运行。但是数据库中没有来 self 的setUp()数据。我在调试器中运行它并连接到临时数据库并进行了检查。

当使用 django.utils.unittest.TestCase 时,数据存在。 las,该方法是聚合数据,因为它针对每个单独的测试运行。

我理解为什么 unittest.TestCase 由于没有刷新数据库而聚合数据。我不明白的是为什么在使用 django.test.TestCase 时数据不存在。即使在 setUp() 方法结束时它仍然是空白的。

django.test.TestCase 不应该保存任何数据还是我做错了什么?

编辑 1: 用这个做了一个干净的项目,它开始工作,我怀疑它应该。 django.test.TestCase 为每个单独的运行在 setup() 方法中用数据填充数据库,所以我想设置必须有一些可疑的东西我这边。我将应用奥卡姆 Razor ,看看我是否能找出它是什么。

编辑 2: 清理模型和测试文件并再次运行测试。将调试器设置为在 setUp() 之后停止,但数据库中仍然没有任何内容。这些对象确实有一个 pk 并且可能会保存到数据库中。检查继承到 ModelModelState 对象,并根据 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 的 django.test.TestCase 不提交事务,因此它永远不会出现在数据库中。整个测试用例被执行 inside a big事务,这样你就无法从外部检查数据库发生了什么(因为在提交事务之前数据库实际上什么都没有发生,而这永远不会发生)

关于Django test.TestCase 与 unittest.TestCase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20044290/

相关文章:

c# - 由于 0.000000001 的不准确性,单元测试失败

c# - 如何对 DataContractSerializer 进行单元测试?

facebook - 将测试人员和管理员添加到 FB 应用程序

testing - TFS 测试 Controller 只能用于一个项目集合吗?

python - 导入错误 : No module named 'tasks'

python - 使用 html5 输入类型 ='color'

swift - 小部件扩展单元测试错误 : "Undefined Symbol: nominal type descriptor for [...]."

android - 以编程方式启用 android 设备管理

django - Backbone.js 发布 500 错误

具有一对一关系的 Django 模型?