request.user 的 Django 测试功能

Django testing function with request.user

我正在尝试为我的 Django 模型中的自定义函数编写测试,但遇到了一些问题。手动测试该功能可以正常工作,因此这是一个测试代码问题。我已经阅读了所有与此相关的问题,但它们并没有解决我的问题。我正在使用 pytest。

下面的代码示例:

models.py - 我想测试这个功能

def save(self, *args, **kwargs):
    if self.in_progress:
        MyModel.objects.filter(user=request.user, flag=True).update(flag=False)
    super(MyModel, self).save(*args, **kwargs)

tests.py

class MyTest(TestCase):

    def setUp(self):
        self.factory = RequestFactory()
        self.user = UserFactory.create()

    def test_that_works(self):
        request = self.factory.get('/mypage/')
        request.user = self.user
        response = my_view(request)
        self.assertEqual(response.status_code, 200)

    def test_that_doesnt_work(self):
        request = self.factory.get('/')
        request.user = self.user
        myitem = MyModelFactory.create()
        myitem.flag = True
        myitem.save()
        assert myitem.flag is True

当我 运行 这些测试时,第一个测试有效,但第二个说 NameError: global name 'request' is not defined

完整的回溯清楚地表明它在测试中到达 myitem.save() 并且错误与将 request.user 传递到 save() 函数有关。

您期望模型 save 方法中的 request 但它没有声明,您甚至没有从 myitem.save() 传递它,请进行以下更改:

在tests.py

myitem.save(request=request)

在models.py

def save(self, *args, **kwargs):
    request = kwargs.pop('request')
    # other code

请记住,save 方法将始终需要 request,这可能不是一个好主意。如果您仍然想坚持使用它,那么我建议将 user 显式传递给模型保存方法,因为您没有对 request:

做任何其他事情

在tests.py

myitem.save(user=request.user)

在models.py

def save(self, *args, **kwargs):
    user = kwargs.get('user')
    # other code