FAILED(失败= 1)销毁别名'default'的测试数据库是否可以?

时间:2017-09-19 13:49:39

标签: python django

我编写了测试代码,然后运行该文件。 我写了这段代码

from django.test import TestCase
from app.models import User

# Create your tests here.
class UserModelTests(TestCase):
    def test_is_empty(self):
        saved_db = list(User.objects.values()[:2])
        expected = [{'name': Tom,'user_id': 1,'nationarity': America, 'dormitory':'A', 'group': 3,'name': Bob,'user_id': 2,'nationarity': China, 'dormitory':'B', 'group': 4}]
        self.assertEqual(expected, saved_db)

所以结果是

System check identified 60 issues (0 silenced).
F
======================================================================
FAIL: test_is_empty (app.tests.UserModelTests)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/app/tests.py", line 12, in test_is_empty
    self.assertEqual(expected, saved_db)
AssertionError: Lists differ: [{'name': 1, 'fixed_constructi[4938 chars]: 0}] != []

First list contains 1 additional elements.
First extra element 0:
{'name': Tom,'user_id': 1,'nationarity': America, 'dormitory':'A', 'group': 3,'name': Bob,'user_id': 2,'nationarity': China, 'dormitory':'B', 'group': 4}
Diff is 5605 characters long. Set self.maxDiff to None to see it.

----------------------------------------------------------------------
Ran 1 test in 0.013s

FAILED (failures=1)
Destroying test database for alias 'default'...

我无法理解这段代码是否正常。当我多次打印出saved_db时,列表的顺序每次都会改变。所以我怀疑我可以比较预期的&列表。 saved_db correctory。没关系?我应该解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

您正在将两个dicts的列表与一个dict的列表进行比较。

expected = [
    {'name': Tom
     'user_id': 1
     'nationarity': America,
     'dormitory':'A',
     'group': 3,
    # Missing closure for dict: }, list sep and opener:
    #  }, {
     'name': Bob,
     'user_id': 2, ...
    }
]

这就是缩进和长线斩波如此重要的原因。

在列表中修复字典之后,最好像这样执行测试代码并避免字典排序问题:

for index, item in enumerate(expected):
    self.assertDictEqual(item, saved_db[index])

然而,假设模型中的排序顺序稳定。

djangonic的做法是:

class UserModelTests(TestCase):
    def test_is_empty(self):
        queryset = User.objects.order_by('user_id').values()[:2]
        expected = [
            {'name': 'Tom', 'user_id': 1, 'nationarity': 'America', 'dormitory': 'A', 'group': 3},
            {'name': 'Bob', 'user_id': 2, 'nationarity': 'China', 'dormitory': 'B', 'group': 4}
        ]
        for idx, item in enumerate(expected):
            self.assertDictEqual(item, queryset[idx])

正如@rafaimp所指出的,如果你没有插入User个对象的data migrations,那么你应该假设你的数据库是空的。添加数据的方法是使用fixtures或填充setUpTestData方法。