PROJECTS

AttributeError: This QueryDict instance is immutable

nicesugi 2022. 10. 20. 20:04

해당 함수는 게시글 작성에 관한 코드.

view, service, Service TestCase 부분에서는 정상 작동되었으나 API TestCase를 작성 중에 발생

response 부분에서 data를 받지 못함.

def test_post_view_def_post_ok(self):
        client = APIClient()
        user = User.objects.get(username = 'test_user')
        create_data = {
            'title' : 'test_title3',
            'content' : 'test_content3',
            'tags' : '#sns',
            'is_active' : True,
            'views' : 60,
            'created_date' : '2022-10-16 08:00:00.000000'
            }
        client.force_authenticate(user = user)
        
        url = '/posts/'
        response = client.post(url, data=create_data)
        result = response.json()
        self.assertEqual(response.status_code, 201)

 

 

🔽  찾아보니 직접 mutable을 설정해보라고 하길래 해보니 안됨 🔽

Newer Django has a immutable QueryDict, so this error will always happen if you are getting your data from querystring or a multipart form body. The test client uses multipart by default, which results in this issue.

Last Resort: If you need to post multipart, and also modify the query dict (very rare, think posting image + form fields) you can manually set the _mutable flag on the QueryDict to allow changing it. This is

setattr(request.data, '_mutable', True)

🔽  결과 : 실패  🔽

AttributeError: 'dict' object has no attribute '_mutable'

 

 

🔽  위의 방법이 되질 않아 검색어에 'dict'을 추가해 찾아보아봄  🔽

For those who are getting a Querydict type on their requests, when sending the payload from the TestCases, but a Dict when passing data from a frontend (eg. React) - You can avoid dealing with a Querydict by just passing the payload as JSON, and as a result, your request.data will be of type 'dict'.

payload = {
            "name": "Dict example"
        }

response = self.client.post(ENDPOINT, json.dumps(chat_payload),content_type="application/json")

This way, you can access the request.data["name"] as a normal dict and makes the operations easier.

 

 

🔽  적용 코드가 정상 작동 ! 🔽 

<Response status_code=201, "application/json">

response = client.post(
            url,
            json.dumps({
                'title': 'test_title3',
                'content': 'test_content3',
                'tags': '#sns',
                'is_active': True,
                'views': 60,
                'created_date': '2022-10-16 08:00:00.000000'
            }),
            content_type="application/json"
        )

 

 

 

🔽  좀 더 깔끔하게 정리하기 위해 중복되는 부분에 변수를 넣어도 정상 작동 ! 🔽

<Response status_code=201, "application/json">

response = client.post(
            url,
            json.dumps(create_data),
            content_type="application/json"
        )

 

 

 

서비스 로직을 분리하고 서비스 테스트 코드를 어느정도 작성이 끝나 API부분 테스트 코드 작성 중인데,, 어렵다

어렵고 나의 코드 보충할것도 리팩토링할 것도 엄청 많은 것 같다. 갈길이 멀다 멀어~

반응형

'PROJECTS' 카테고리의 다른 글

pytest 에러  (0) 2022.12.07
Django | RESTful API는 뒤에 slash가 없어야하는데 WARNING 발생  (0) 2022.11.10
쿼리수 줄이기  (0) 2022.10.13
쿼리수 확인  (0) 2022.10.12
set_password | make_password | check_password  (0) 2022.09.08