Python 我应该如何用Django编写视图单元测试?

Python 我应该如何用Django编写视图单元测试?,python,django,django-unittest,Python,Django,Django Unittest,我想用Django为这个方法编写一个单元测试 def activate(request): id = int(request.GET.get('id')) user = User.objects.get(id=id) user.is_active = True user.save() return render(request, 'user_authentication/activation.html') 我写了这样的东西: def test_activ

我想用Django为这个方法编写一个单元测试

def activate(request):
    id = int(request.GET.get('id'))
    user = User.objects.get(id=id)
    user.is_active = True
    user.save()
    return render(request, 'user_authentication/activation.html')
我写了这样的东西:

def test_activate_view(self):
    response = self.client.get('/activation', follow=True)
    self.assertTemplateUsed(response, 'user_authentication/activation.html')
它不起作用,因为我收到一个错误:

id = int(request.GET.get('id'))
TypeError: int() argument must be a string or a number, not 'NoneType':

我应该在测试中更改什么?

您的视图从
请求中读取数据。获取
-您需要传递此数据:

response = self.client.get('/activation?id=1', follow=True)
之后还可以从数据库中获取此用户。因此,您需要加载一些夹具数据。使用
manage.py dumpdata
创建一个fixture,并将其加载到单元测试中,如下所示:

class UserTestCase(TestCase):
    fixtures = ['fixture.json', 'users']
有关加载夹具的详细说明

注意您的方法

对于这个用例,您不应该使用users
id
。你可以很容易地猜出这个
id
并激活帐户

有人可能会使用有效的电子邮件地址注册一次,然后收到您内部带有
id
的链接,然后在不提供有效电子邮件地址的情况下创建一组帐户


相反,您可能会生成一个唯一的随机密钥(aka令牌),并将该令牌与用户关联。您的视图应该接受这些令牌并基于它解析用户。这样就不能再轻易激活了。

测试发现了一个bug:如果有人没有在get请求中传递
id=…
参数,您将得到500个错误。您可能应该首先修复错误;-)Django的内置密码通过电子邮件重置,具有正确执行此操作所需的所有功能: