为什么这个 Django TestCase 测试不通过?

Why won't this Django TestCase test pass?

我正在尝试为 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)

我运行这个测试的时候,return值USER_DELETED是正确的,但是用户对象并没有真正删除。

self.setup() returns 一个创建的用户。如果需要,我可以 post 这个,但是设置和拆卸都可以与 UserTest class.

中的各种其他测试一起使用

下面是正在测试的模型方法:

@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

谁能解释一下我做错了什么?

谢谢。

我认为您可以使用 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()