Django使用request.user测试功能

时间:2017-11-30 14:10:48

标签: python django testing pytest

我正在尝试在我的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()函数有关。

1 个答案:

答案 0 :(得分:1)

您在模型request方法中期待save但未声明,您甚至未从myitem.save()传递,请执行以下更改:

test.py中

myitem.save(request=request)
models.py

中的

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

请注意,save方法始终需要request,这可能不是一个好主意。如果你仍然想坚持下去,那么我建议明确地将user传递给模型保存方法,因为你没有对request做任何其他事情:

test.py中

myitem.save(user=request.user)
models.py

中的

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