2010-04-14 8 views
5

내 모델에 대한 단위 테스트를 보완하기 위해 내 뷰에 대한 자세한 기능 테스트를 작성하고 있습니다. 그것은 장고 프로젝트이고 unittest에 장고 테스트 프레임 워크를 내장하고 있습니다. 분명히 이러한 기능 테스트에서 확인해야 할 중요한 사항 중 하나는 사용 권한이 올바르게 설정된다는 것입니다. 이 같은 그 마음에, 내가하려고 해요 뭔가 :장고 테스트에서 권한 오류를 감지합니다.

anonclient = Client() 
userclient = Client() 
userclient.login(username='test_user', password='test') 
adminclient = Client() 
adminclient.login(username='test_admin', password='test') 

path = "/path/to/my/page" 
anonresponse = anonclient.get(path) 
userresponse = userclient.get(path) 
adminresponse = adminclient.get(path) 

나는 adminclient가 제대로 작동하는 동안 anonclient 및 userclient 모두 권한이 거부 된 것을 확인 할 수 있어야합니다. Howerver, 나는 이것이 일어났다 고 테스트 할 수있는 방법을 찾지 못했습니다 !

처음에는 응답이 302 리디렉션인지 확인하기로 결정했는데 (권한 검사에 실패하면 부작용이 리디렉션되기 때문에) 사용자에게 자동으로 리디렉션되는 기능과 사용 권한 확인에 실패했습니다. (보기에서 permission_required 데코레이터의 login_url 매개 변수를 통해 대상 URL을 덮어 쓸 수 있기 때문에 self.assertRedirects (response, url)을 사용할 수 없습니다!)

아마도 내가 user_passes_test 데코레이터를 확장하여 테스트가 실패하면 응답 객체에 대한 속성? 그런 다음 테스트에서 확인할 수 있습니다. 요청의 부작용이 발생했는지 확인하여 요청의 성공 여부를 확인해야합니다. 이렇게하면 효과가 있지만, 특히 많은 수표가 수행되는 등 매우 오랜 시간이 걸릴 것입니다.

나는이 문제를 다루는 첫 사람이라고 상상할 수 없습니다.이 문제를 해결할 올바른 방법은 무엇입니까? 또는 무엇을 놓쳤습니까?

대단히 감사합니다.

답변

1

django 테스트 클라이언트는 login 메소드를 호출 할 때 boolean 값을 반환합니다.이 메소드는 로그인 성공 여부를 알려줍니다.

[17] >>> from django.test import Client 
[18] >>> c = Client() 
[19] >>> c.login(username='superuser', password='bar') 
[19] : False 
[20] >>> c.login(username='superuser', password='correct_password') 
[20] : True 
+0

감사합니다 저스틴,하지만 내 질문에 대한 오해했습니다 - 나는 후속 얻을 성공했는지 또는 사용 권한 오류가 발생하는지 (결과 리디렉션 함께) 확인해야합니다. 로그인이 정상적으로 작동합니다. 장고보기에서 권한 검사가 작동하는지 테스트 할 수 있어야합니다. – adamnfish

+0

결과 URL에 액세스하려고 시도했는지 확인해야합니다. my_url = '/ foo /' resp = c.get (my_url) 그런 다음 결과 페이지와 관련된 항목에 대해''resp'' 개체를 검사 할 수 있습니다. docs.djangoproject.co.kr/ko/dev/topics/testing/# testing-responses 구체적으로, 상태 코드, 올바른 템플릿이 사용되었는지 확인하는 것 등. –

+0

내가 말했듯이 리디렉션을 제공하는보기와 사용자가 테스트에 실패하여 리디렉션되는보기의 차이점을 알리고 싶습니다. 내가 부작용이나 결과 페이지 냄새를 검사 할 수 있다는 것을 알고있다. (실제로 이것은 내가 현재하고있는 일이다.) 그러나 사용자가 테스트를 통과하지 못했다는 것을 감지 할 수있는 방법이 있는지 궁금했다. 직접 실행하십시오. 1.2 릴리스 이후에 기능 요청을 제출하거나 패치 된 user_passes_test 데코레이터를 직접 롤백 할 것으로 생각됩니다. – adamnfish

1

permission_required 장식 및 PermissionRequiredMixinraise_exception 파라미터를 갖는다.

가 다루는 한 가지 방법은 당신이

from django.conf import settings 

@permission_required('<perm>', 
        raise_exception=settings.PERMISSIONS_RAISE_EXCEPTION) 
def your_view(...) 
    pass 

class YourView(PermissionRequired): 
    raise_exception = settings.PERMISSIONS_RAISE_EXCEPTION 

이 방법을 테스트 실행을위한 별도의 설정을 사용하고있는 경우 settings_test.py (당신이 다음을 잡을 수 있습니다에 PERMISSIONS_RAISE_EXCEPTION=True 설정 옵션 같은 것을 가지고

입니다 당신의 시험에서 403, 로그인 페이지로 리디렉션을 유지하기위한 예외/테스트.

client.login('user', 'blah') 
response = client.get('/yourview') 
assertNot(403, response.status_code) 

모든 permission_required 장식에 설정을 추가하기는 다소 기분, 취향에되지 않을 수도 있습니다 귀하의 소스에 테스트 코드를 추가하는 것이지만, 지금까지 본 유일한 방법입니다.

관련 문제