2017-12-31 267 views
1

장고에서이 메소드의 단위 테스트를 작성하고 싶습니다. Django에서 unittest 뷰를 작성하는 방법은 무엇입니까?

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') 

는이 같은 STH를 썼다 :

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': 

내가 내 테스트에 어떤 변경해야을?

+0

글쎄, 테스트에서 버그가 발견되었습니다. 누군가가 GET 요청에'id = .. '매개 변수를 전달하지 않으면 500 오류가 발생합니다. 먼저 버그를 고쳐야합니다 ;-) – thebjorn

답변

2

로보기는 request.GET에서 데이터를 읽고 - 당신은이 데이터를 전달해야합니다 : 당신은 또한 당신의 데이터베이스에서 나중에이 사용자를 가져

response = self.client.get('/activation?id=1', follow=True) 

합니다. 그러므로 조명기 데이터를로드해야합니다. manage.py dumpdata를 사용하여 고정을 만들고 그 같이 당신의 단위 테스트에서로드 : 자세한 설명을위한 로딩기구에 대한

class UserTestCase(TestCase): 
    fixtures = ['fixture.json', 'users'] 

Read the docs. 당신의 접근 방식

당신이 사용하는 경우에 사용자에게 id를 사용하지 말아야에 대한

참고. 쉽게 id을 추측하고 계정을 활성화 할 수 있습니다.

누군가는 유효한 이메일 주소로 한 번 등록 할 수 있으며 id으로 귀하의 링크를 수신 할 수 있으며 유효한 이메일 주소를 제공하지 않고 나중에 계정을 만들 수 있습니다.

대신 고유하고 임의의 비밀 (토큰)을 생성하고이 토큰을 사용자와 연결할 수 있습니다. 귀하의 견해는 그러한 토큰을 받아 들여이를 기반으로 사용자를 해결해야합니다. 이렇게하면 더 이상 쉽게 활성화 할 수 없습니다.

+1

장고의 내장 비밀번호는 이메일로 재설정되며,이 작업을 수행하는 데 필요한 모든 기능이 있습니다. https://simpleisbetterthancomplex.com/tutorial/2016/09/19/how-to- create-password-reset-view.html – thebjorn