gpt4 book ai didi

python - 使用 request.user 的 Django 测试功能

转载 作者:行者123 更新时间:2023-11-28 21:22:51 24 4
gpt4 key购买 nike

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

测试.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:未定义全局名称“request”

完整的回溯清楚地表明它正在测试中到达 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

关于python - 使用 request.user 的 Django 测试功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47575472/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com