【问题标题】:Why won't this Django TestCase test pass?为什么这个 Django TestCase 测试不通过?
【发布时间】:2020-06-12 01:48:10
【问题描述】:

我正在尝试为 API 编写测试。我遇到了几个用户模型方法的问题。这些方法都适用于开发和生产环境,但测试却不行。

这是测试:

    def test_delete_user(self):
        USER_DELETED = 1

        self.u = self.setup()
        result = User.delete_user(self.u, self.u.pk)

        # response
        self.assertEqual(result, USER_DELETED)
        # functionality
        self.assertIsNone(self.u)
        print(self.u)

当我运行这个测试时,返回值USER_DELETED是正确的,但实际上并没有删除用户对象。

self.setup() 返回单个创建的用户。如果需要,我可以发布它,但设置和拆卸都适用于 UserTest 类中的各种其他测试。

这是正在测试的模型方法:

@staticmethod
    def delete_user(requesting_user, user_id):
        # static variables
        USER_DELETED = 1
        NOT_AUTHORIZED = 0
        NO_USER = -1

        user_to_be_deleted = User.get_user_from_user_id(user_id)

        if user_to_be_deleted == NO_USER:
            return NO_USER

        # check for authorization to delete
        if requesting_user != user_to_be_deleted:
            return NOT_AUTHORIZED

        user_to_be_deleted.delete()

        return USER_DELETED

我还尝试使用设置创建用户,然后调用 self.u.delete() 而不是我拥有的自定义方法。这给出了相同的结果:AssertionError: <User: test_user> is not None

有人可以解释我在这里做错了什么吗?

谢谢。

【问题讨论】:

  • 如果在断言None 之前调用self.u.refresh_from_db(),结果是否相同?
  • 我刚试过self.u.refresh_from_db(),它给了我这个错误:prototype.models.User.DoesNotExist: User matching query does not exist.,这让我觉得这是在正确的轨道上。
  • 从数据库中删除条目不会导致实例突然变为None。您需要测试数据库中不再存在具有相同pk的条目

标签: python django unit-testing testcase


【解决方案1】:

我认为您可以使用 asserRaises 来测试删除功能。正如 Thomas 提到的,您应该 self.u.refresh_from_db,但由于对象已被删除,这将引发 DoesNotExists,因此正确的测试方法如下。

def test_delete_user(self):
    USER_DELETED = 1

    self.u = self.setup()
    result = User.delete_user(self.u, self.u.pk)

    # response
    self.assertEqual(result, USER_DELETED)
    # functionality

    with self.assertRaises(User.DoesNotExist):
         self.u.refresh_from_db()

【讨论】:

  • 有关更多信息,请参阅有关此主题的文档:docs.djangoproject.com/en/3.0/ref/models/instances/… 具体来说,“这只会删除数据库中的对象;Python 实例仍将存在,并且其字段中仍将有数据”
  • 谢谢。我最终使用 assertFalse() 在查询 pk 时查看查询集是否存在。我认为您的解决方案可能更直接一些。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-22
  • 1970-01-01
  • 1970-01-01
  • 2021-02-09
  • 2021-10-25
  • 2011-02-04
相关资源
最近更新 更多