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