我正在尝试在我的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()
函数有关。
答案 0 :(得分:1)
您在模型request
方法中期待save
但未声明,您甚至未从myitem.save()
传递,请执行以下更改:
myitem.save(request=request)
models.py 中的
请注意, def save(self, *args, **kwargs):
request = kwargs.pop('request')
# other code
save
方法始终需要request
,这可能不是一个好主意。如果你仍然想坚持下去,那么我建议明确地将user
传递给模型保存方法,因为你没有对request
做任何其他事情:
models.py myitem.save(user=request.user)
def save(self, *args, **kwargs):
user = kwargs.get('user')
# other code