【问题标题】:Why I get error when run two tests in Django APITestCase?为什么在 Django APITestCase 中运行两个测试时会出错?
【发布时间】:2020-01-21 22:38:53
【问题描述】:

我为我的 API 进行测试。当我运行两个测试时,我在 第二个测试self.user = User.objects.get(pk=48) 行中收到错误apps.users.models.DoesNotExist: User matching query does not exist.。但是如果我只运行一个测试,测试就通过了。是什么原因?

class MyTestCase(APITestCase):
    def setUp(self):
        user_data = []
        for i in range(1, 124):
            user_data.append({
                'email': 'first@mail.com'+str(i),
                'first_name': "firstname"+str(i),
                'last_name': "lastname"+str(i),
                'ip_address': "192.168.0."+str(i),
            })
        users = User.objects.bulk_create([User(**i) for i in user_data])
        self.user = User.objects.get(pk=48)   # I get error in this line

    def test_users_list(self):
        ...

    def test_users_pagination(self):
        url = reverse('users-list')
        self.client.force_authenticate(self.user)
        response = self.client.get(url, {'users_count': 24, 'page': 2})

【问题讨论】:

    标签: python django django-rest-framework python-unittest django-testing


    【解决方案1】:

    setUp 方法在您在测试用例中定义的每个测试之前调用。发生的情况是第一个测试运行 setUp 并创建具有从 1 到 123 的 pk 值的用户,第二个测试创建具有从 124 到 246 的 pk 值的用户,因此没有 pk=48 的用户。

    尝试根据email='first@mail.com48'等其他属性选择用户,你应该会很好。

    【讨论】:

    • 谢谢。但是当我在bulk_create 之后看到users[0].pkusers[0].id 时,我得到None。当我看到users[0].email 时,我得到了正确的email 值。这是什么?
    • 那么我假设您没有使用 PostgreSQL。来自 bulk_create 的文档:如果模型的主键是 AutoField [bulk_create] 不会像 save() 那样检索和设置主键属性,除非数据库后端支持它(当前是 PostgreSQL)。
    猜你喜欢
    • 2019-05-20
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    • 2021-11-24
    • 1970-01-01
    • 2016-06-20
    相关资源
    最近更新 更多