더 이상 TestCase 클래스를 사용하고 싶지 않습니다!
문제
이유는 모르겠지만 뷰를 테스트할 때 클래스 접근 방식을 사용해야 한다는 의견이 있었습니다. 단일 테스트에서 픽스처를 로드하려고 할 때 문제가 나타납니다. 당신은 할 수 없습니다! 그리고 문서에도 메모가 있습니다.
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 aboveusefixtures
andautouse
examples should help to mix in pytest fixtures into unittest suites. You can also gradually move away from subclassing fromunittest.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에서도 읽을 수 있습니다.
Reference
이 문제에 관하여(더 이상 TestCase 클래스를 사용하고 싶지 않습니다!), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/kuba_szw/i-dont-want-to-use-testcase-class-anymore-31i7텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)