Nice programing

장고 뷰에 대한 단위 테스트를 작성하는 방법은 무엇입니까?

nicepro 2020. 11. 24. 19:52
반응형

장고 뷰에 대한 단위 테스트를 작성하는 방법은 무엇입니까?


단위 테스트가 django를 위해 어떻게 설계되어야하는지 이해하는 데 문제가 있습니다.

내 이해에서 전체보기를 한 번에 테스트하는 것은 불가능 해 보입니다. 요청의 사전 게시 상태와 사후 상태를 구분해야합니다. 그러나 나는 이것을 디자인하는 방법을 모른다. 실제 사례가 있습니까?

문서를 보면 예제가 너무 단순화되어 모델에만 집중되어 있습니다.

@login_required
def call_view(request, contact_id):
    profile = request.user.get_profile()
    if request.POST:        
        form = CallsForm(profile.company, request.POST)           
        if form.is_valid()
        return HttpResponseRedirect('/contact/' + contact_id + '/calls/')
    else:        
        form = CallsForm(profile.company, instance=call)              
    variables = RequestContext(request, {'form':form}
    return render_to_response('conversation.html', variables)

최신 정보:

성공 테스트를 시도했지만 여전히 실패합니다.

def test_contact_view_success(self):
    # same again, but with valid data, then
    self.client.login(username='username1', password='password1')
    response = self.client.post('/contact/add/', {u'last_name': [u'Johnson'], }) 
    self.assertRedirects(response, '/')

에러 메시지:

AssertionError: Response didn't redirect as expected: Response code was 200 (expected 302)

form.is_valid ()가 실패하고 리디렉션되지 않기 때문이라고 생각합니다. 맞습니까?


NB NB! 아래에서 설명하는 것은 엄격하게 "단위 테스트"가 아닙니다. Django 뷰 코드에 대한 독립적 인 단위 테스트를 작성하는 것은 거의 불가능합니다. 이것은 통합 테스트에 가깝습니다 ...

귀하의 견해를 통해 몇 가지 경로가 있다는 것이 맞습니다.

  1. GET또는 POST익명 사용자 (로그인 페이지로 리디렉션해야 함)
  2. GET또는 POST프로필없이 로그인 한 사용자 ( UserProfile.DoesNotExist예외를 발생 시켜야 함 )
  3. GET 로그인 한 사용자 (양식을 보여야 함)
  4. POST 빈 데이터가있는 로그인 한 사용자가 작성 (양식 오류를 표시해야 함)
  5. POST 로그인 한 사용자가 유효하지 않은 데이터 (양식 오류를 표시해야 함)
  6. POST 유효한 데이터가있는 로그인 한 사용자에 의해 (리디렉션되어야 함)

테스트 1 은 실제로 테스트 @login_required뿐이 므로 건너 뛸 수 있습니다. 나는 어쨌든 그것을 테스트하는 경향이 있습니다 (나 또는 다른 누군가가 그 데코레이터를 사용하는 것을 잊었을 경우).

나는에 실패 케이스 (500 에러 페이지) 확실하지 않다 (2) 당신이 정말로 원하는 것입니다. 대신 발생하고 싶은 일을 해결합니다 (아마도를 사용get_or_create() 하거나 DoesNotExist예외를 포착하고 그런 식으로 새 프로필을 만듭니다).

사용자 정의 유효성 검사의 양에 따라 4 개를 실제로 테스트 할 필요가 없을 수 있습니다.

어쨌든 위의 모든 것이 주어지면 다음과 같이 할 것입니다.

from django.test import TestCase

class TestCalls(TestCase):
    def test_call_view_denies_anonymous(self):
        response = self.client.get('/url/to/view', follow=True)
        self.assertRedirects(response, '/login/')
        response = self.client.post('/url/to/view', follow=True)
        self.assertRedirects(response, '/login/')

    def test_call_view_loads(self):
        self.client.login(username='user', password='test')  # defined in fixture or with factory in setUp()
        response = self.client.get('/url/to/view')
        self.assertEqual(response.status_code, 200)
        self.assertTemplateUsed(response, 'conversation.html')

    def test_call_view_fails_blank(self):
        self.client.login(username='user', password='test')
        response = self.client.post('/url/to/view', {}) # blank data dictionary
        self.assertFormError(response, 'form', 'some_field', 'This field is required.')
        # etc. ...

    def test_call_view_fails_invalid(self):
        # as above, but with invalid rather than blank data in dictionary

    def test_call_view_fails_invalid(self):
        # same again, but with valid data, then
        self.assertRedirects(response, '/contact/1/calls/')

분명히 여기서 단점은 하드 코딩 된 URL입니다. 당신도 수 를 사용reverse() 하여 시험 또는에서 사용하는 빌드 요청RequestFactory 하고 (오히려 URL보다는) 방법으로 귀하의 의견을 호출합니다. 하지만 후자의 방법을 사용하는 경우에도 하드 코딩 된 값을 사용하거나 reverse()리디렉션 대상을 테스트 해야합니다 .

도움이 되었기를 바랍니다.


Django ships with a test client which can be used to test the full request/response cycle: The docs contain an example of making a get request to a given url and asserting the status code as well as the template context. You would also need a test which does a POST and asserts a successful redirect as expected.

참고URL : https://stackoverflow.com/questions/11885211/how-to-write-a-unit-test-for-a-django-view

반응형