【问题标题】:Django test not actualizing objectDjango测试没有实现对象
【发布时间】:2017-01-26 15:58:10
【问题描述】:

我有一个 django rest 框架测试,它只是常规 django 测试的包装器,其工作方式完全相同。代码如下所示:

user_created = User.objects.create_user(first_name="Wally", username="farseer@gmail.com", password="1234",
                                            email="farseer@gmail.com")

client_created = Client.objects.create(user=user_created, cart=cart)

data_client_profile["user"]["first_name"] = "Apoc"

response = self.client.put(reverse("misuper:client_profile"), data_client_profile, format="json")

client_created.refresh_from_db()  # Tried this too

self.assertEqual(response.status_code, status.HTTP_200_OK)

self.assertEqual(client_created.user.first_name, data_client_profile["user"]["first_name"])

所以,我想用字典data_client_profile 中的一些数据更新client_created 对象,然后assertEqualclient.user.first_name 是“Apoc”。

这是视图中的代码,我添加了两个pdb.set_trace(),这不仅有助于粘贴所有代码:

        pdb.set_trace()

        client_existing_user_obj.phone = phone
        client_existing_user_obj.user.email = email
        client_existing_user_obj.user.first_name = first_name # Updating here!
        client_existing_user_obj.user.last_name = last_name
        client_existing_user_obj.user.save()
        client_existing_user_obj.save()
        pdb.set_trace()

第一个 pdb 中断显示:

(Pdb) client_existing_user_obj.user.username
u'farseer@gmail.com'  # Make sure I'm updating the created object
(Pdb) client_existing_user_obj.user.first_name
u'Wally'  # First name is not updated yet

第二个 pdb 中断显示:

(Pdb) client_existing_user_obj.user.first_name
u'Apoc'  # Looks like the first name has being updated!

但是,当测试运行时,我得到了错误:

self.assertEqual(client_created.user.first_name, data_client_profile["user"]["first_name"])
AssertionError: 'Wally' != 'Apoc'

为什么会失败?我什至打电话给refresh_from_db()。我确认它已在视图中更新,但在测试中它看起来没有。我不明白。

【问题讨论】:

    标签: django django-testing django-tests


    【解决方案1】:

    注意refresh_from_db 的文档说client_created.user 不会被client_created.refresh_from_db() 刷新,因为client_created.user_id 保持不变:

    关系值不再有效的先前加载的相关实例将从重新加载的实例中删除。例如,如果你有一个从重新加载的实例到另一个名为Author 的模型的外键,那么如果obj.author_id != obj.author.idobj.author 将被丢弃,下次访问时将使用@987654329 的值重新加载@。

    因此需要刷新client_created.user

    client_created.user.refresh_from_db()
    

    或自己重新获取client_created

    client_created = Client.objects.get(pk=client_created.pk)
    

    【讨论】:

      【解决方案2】:

      这是您需要从数据库中刷新的 用户,因为这是您正在修改的对象:

      user_created.refresh_from_db()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-09
        • 2014-07-22
        • 2010-10-20
        相关资源
        最近更新 更多