我可以使用灯具从生产数据库创建测试吗?

时间:2017-08-18 19:06:51

标签: django database testing fixture

我在Django应用程序中发现了一个奇怪的错误。我可以在/people/<pk>访问该视图。在测试中它工作得很好,但在生产中我偶然发现了一些错误(只有几个!)pk:Reverse for 'single-person' with arguments '('',)' not found. 1 pattern(s) tried: ['people/(\\d+)/?$']。因为我无法用我的测试来捕获它,所以我想用数据库的当前状态创建另一个测试来进行调试。另外,为了防止这样的未来情况,我总是希望能够使用生产数据库的副本运行我的测试,以最大限度地减少实际数据出错的可能性。

我认为它会像

一样简单
manage.py dumdata --output db-test.json

然后

from django.contrib.staticfiles.testing import StaticLiveServerTestCase
from django.test import Client

from people.models import Person


class TestPeopleWithMyData(StaticLiveServerTestCase):
    fixtures = ['db-test.json']

    def setUp(self):
        self.client = Client()
        self.client.force_login(user='test_user')

    def test_person(self):
        for person in Person.objects.all():
            print('Testing %s: ' % person, end='')
            r = self.client.get('/people/%d' % person.pk)
            print(r)
            ...

但是这次尝试失败了:

======================================================================
ERROR: setUpClass (people.tests.test_my_data.TestPeopleWithMyData)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/username/Documents/python_projects/project/venv/lib/python3.6/site-packages/django/db/models/fields/related_descriptors.py", line 178, in __get__
    rel_obj = getattr(instance, self.cache_name)
AttributeError: 'Person' object has no attribute '_added_by_cache'

(我的added_by模型中有一个名为Person的字段。)然后它继续说django.contrib.auth.models.DoesNotExist: Problem installing fixture '/Users/username/Documents/python_projects/project/db-test.json': User matching query does not exist.

因为我知道这个数据库工作得很好,所以对我来说不合适。所以在我开始调试这个问题之前,我想了解我所做的事情是否可能是根本错误的,我不应该像这样创建测试夹具。或者我错过了一些简单的错误?

1 个答案:

答案 0 :(得分:0)

我认为在运行测试之前你需要做的事情

python manage.py makemigrations
python manage.py migrate

在你的夹具文件中你有&#39; _added_by_cache&#39;那不在你的模特中。

相关问题