더 이상 TestCase 클래스를 사용하고 싶지 않습니다!

나는 수업의 열렬한 팬이며 때때로 필요하지 않더라도 OOP를 수행합니다. 하지만 이봐, 모두가 자신의 스타일이 있습니다!

문제



이유는 모르겠지만 뷰를 테스트할 때 클래스 접근 방식을 사용해야 한다는 의견이 있었습니다. 단일 테스트에서 픽스처를 로드하려고 할 때 문제가 나타납니다. 당신은 할 수 없습니다! 그리고 문서에도 메모가 있습니다.

unittest.TestCase methods cannot directly receive fixture arguments as implementing that is likely to inflict on the ability to run general unittest.TestCase test suites. The above usefixtures and autouse examples should help to mix in pytest fixtures into unittest suites. You can also gradually move away from subclassing from unittest.TestCase to plain asserts and then start to benefit from the full pytest feature set step by step.



A그리고 간단한 메모. 테스트 이름 때문에 나를 미워하지 마십시오. 그것은 단지 당신에게 sth를 보여주는 것입니다.

솔루션 1



확인. 그럼 usefixtures부터 시작해 봅시다. 기본적으로 문자열 값이 있는 이름으로 조명기를 가져올 수 있으며 작동합니다.

# /test_views.py

class ExerciseViewTestCase(TestCase):
    @pytest.mark.django_db
    @pytest.mark.usefixtures('exercise')
    def test_endpoint_should_return_list_of_exercises(self):
        response = self.client.get(reverse('classes:exercise-list'), **self.get_header())
        assert response.status_code == status.HTTP_200_OK
            assert response.data != []


또한 이 클래스의 여러 테스트에서 이 연습 기능을 사용하려면 다음을 수행할 수 있습니다.

# /test_views.py

@pytest.mark.usefixtures('exercise_instance')
class ExerciseViewTestCase(TestCase):
    @pytest.mark.django_db
    def test_endpoint_should_return_list_of_exercises(self):
        response = self.client.get(reverse('classes:exercise-list'), **self.get_header())
        assert response.status_code == status.HTTP_200_OK
                assert response.data != []


나는 이에 대한 응답으로이 운동을했습니다. 하지만 이봐! 픽스처와 함께 가져오는 것이 정확히 이 연습인지 알고 싶었기 때문에 인수에 해당 인스턴스가 필요했습니다!

문제는 그들이 말했듯이 .. "...픽스처 인수를 직접 받을 수 없습니다..."입니다. 🙁

나에게 훨씬 더 나은/청소기/섹시한 솔루션인 둘러보기는 이제 TestCase 클래스를 제거하는 것입니다.

솔루션 2



그래서 우리는 무엇을 필요로 하는가:
  • 클라이언트
  • 로그인된 사용자
  • 운동 기구

  • 수퍼유저와 클라이언트도 픽스처가 될 수 있습니다.

    # /conftest.py
    
    @pytest.fixture()
    def superuser():
        return UserModel.objects.create_superuser(
            username='test_user',
            email=EMAIL,
            password=TEST_PASSWORD
        )
    
    @pytest.fixture()
    def superuser_client(superuser):
        client = Client()
    
        token = client.post('/rest-auth/login/', data={
            'username':EMAIL,
            'password':TEST_PASSWORD
        }).data.get('key')
    
        client.defaults.update({'HTTP_AUTHORIZATION': f'Token {token}'})
        return client
    


    토큰 인증이 있었으므로 로그인 후 클라이언트 인스턴스에서 기본 인수를 업데이트해야 했습니다.

    그런 다음 superuser_client를 인수로 가져올 수 있습니다. 토큰이 설정된 상태로 기록되고 요청할 준비가 됩니다.

    이 섹시 테스트로 돌아가 봅시다.

    # /test_views.py 
    
    @pytest.mark.django_db
    def test_endpoint_should_return_list_of_exercises(client_with_superuser, exercise_instance):
        response = client_with_superuser.get(reverse('classes:exercise-list'))
        assert response.status_code == status.HTTP_200_OK
        assert response.data[0].get('id') == exercise_instance.id
    


    매끄러운...

    건배!

    그리고 간단한 참고 사항: 이것은 내가 원래 게시한 것입니다here. medium에서도 읽을 수 있습니다.

    좋은 웹페이지 즐겨찾기