본문 바로가기
Back-End/Django

[Django] ArrayField Integer 인 경우 test code 사용 방법

by 흐암졸령 2022. 7. 25.
반응형

[ 문제점 ]

 다음과 같이 django 에서 model 에 ArrayField를 사용해서 만들었다고 하자.

from django.db import models
from django.contrib.postgres.fields import ArrayField


class User(models.Model):
	array = ArrayField(models.IntegerField())

ArrayField 안에는 IntegerField를 넣어서 정수의 배열을 받는다. 이를 테스트 하기 위해서 다음과 같은 테스트 코드를 작성하였다.

import pytest

from rest_framework import status
from rest_framework.test import APITestCase


@pytest.mark.django_db
class UserTest(APITestCase):
	def test_user(self):
    	result = self.client.post(
        	"/user/",
            {
            	array: [1, 2, 3]
            }
        )
        print(result.json())
        self.assertEqual(result.status_code, status.HTTP_201_CREATED)

위의 테스트코드를 실행시키면 아래와 같은 에러가 나타난다.

 

[ 해결방법 ]

 우선 에러를 해결하기 전에 그 원인부터 보자. 우리는 model를 ArrayField 안에 IntegerField로 저장을 하였으나 실제 요청된 값을 보면 ['1', '2', '3'] 으로 나와있다. 즉 정수가 아니라 각각의 값을 문자열로 받은 것이다. 즉 타입의 문제로 오류가 나타난 것이므로 이를 정수로 바꾸어서 테스트를 해야한다. 

 

 django는 주로 json을 이용하여 값을 주고받는데 지금 파이썬의 dict 객체를 보내는 것이니 이를 json.dumps 함수를 사용하여 json으로 변환하고 보내면 된다. 또한 content_type을 application/json으로 명시한다.

import pytest
import json

from rest_framework import status
from rest_framework.test import APITestCase


@pytest.mark.django_db
class UserTest(APITestCase):
	def test_user(self):
    	result = self.client.post(
        	"/user/",
            json.dumps(
            	{
            		array: [1, 2, 3]
            	}
            ),
            content_type="application/json"
        )
        print(result.json())
        self.assertEqual(result.status_code, status.HTTP_201_CREATED)

이렇게 바꾸어 테스트를 하면 정상적으로 작동한다.

반응형

댓글