[django | user app] Build a Backend REST API - 23



Add tests for create user API🎐


これから本格的にuserapiの作成を開始しますでも初めては何だったの?TDD(Test Driven Development)で行います!app/user/tests/フォルダに新しいファイルtest_user_api.pyを作成します.
今日完成するコードは以下の通りです.
誰もが分析しなければなりませんか?
from django.test import TestCase
from django.contrib.auth import get_user_model
from django.urls import reverse

from rest_framework.test import APIClient
from rest_framework import status


CREATE_USER_URL = reverse('user:create') # create `user create` URL 
TOKEN_URL = reverse('user:token')


def create_user(**params):
    return get_user_model().objects.create_user(**params)


class PublicUserApiTests(TestCase):
    """Test the users API (public)"""

    def setUp(self):
        self.client = APIClient()

    def test_create_valid_user_success(self):
        """Test creating user with valid payload is successful"""
        payload = {
            'email': '[email protected]',
            'password': 'testpass',
            'name': 'Test name',
        }
        res = self.client.post(CREATE_USER_URL, payload)

        self.assertEqual(res.status_code, status.HTTP_201_CREATED)
        user = get_user_model().objects.get(**res.data)
        self.assertTrue(user.check_password(payload['password']))
        self.assertNotIn('password', res.data)

    def test_user_exists(self):
        """Test creating a user that already exists fails"""
        payload = {'email': '[email protected]', 'password': 'testpass'}
        create_user(**payload)

        res = self.client.post(CREATE_USER_URL, payload)

        self.assertEqual(res.status_code, status.HTTP_400_BAD_REQUEST)

    def test_password_too_short(self):
        """Test that the password must be more thatn 5 characters"""
        payload = {'email': '[email protected]', 'password': 'pw'}
        res = self.client.post(CREATE_USER_URL, payload)

        self.assertEqual(res.status_code, status.HTTP_400_BAD_REQUEST)
        user_exists = get_user_model().objects.filter(
            email=payload['email']
        ).exists()
        self.assertFalse(user_exists)

step1 import🤕


  • TestCaseクラスのインポートこのクラスは親になり、他のクラスに継承されます.

  • get user modelはUserクラスを使用するためにインポートします.
  • reverse()メソッドは、API URLを作成します.

  • APIClientクラスはrestframeworkのテストを支援するツールです.

  • そしてstatusをインポート以前は単純な数字、200、201、400、404を使っていましたが、rest_frameworkを使うと単語や文字をより直感的に説明します.
  • from django.test import TestCase
    from django.contrib.auth import get_user_model
    from django.urls import reverse
    
    from rest_framework.test import APIClient
    from rest_framework import status

    step2 let's do it😀

    CREATE_USER_URL = reverse('user:create') # create `user create` URL 
    TOKEN_URL = reverse('user:token')
    
    
    def create_user(**params):
        return get_user_model().objects.create_user(**params)
    
    
    class PublicUserApiTests(TestCase):
        """Test the users API (public)"""
    
        def setUp(self):
            self.client = APIClient()
    
        def test_create_valid_user_success(self):
            """Test creating user with valid payload is successful"""
            payload = {
                'email': '[email protected]',
                'password': 'testpass',
                'name': 'Test name',
            }
            res = self.client.post(CREATE_USER_URL, payload)
    
            self.assertEqual(res.status_code, status.HTTP_201_CREATED)
            user = get_user_model().objects.get(**res.data)
            self.assertTrue(user.check_password(payload['password']))
            self.assertNotIn('password', res.data)
    
        def test_user_exists(self):
            """Test creating a user that already exists fails"""
            payload = {'email': '[email protected]', 'password': 'testpass'}
            create_user(**payload)
    
            res = self.client.post(CREATE_USER_URL, payload)
    
            self.assertEqual(res.status_code, status.HTTP_400_BAD_REQUEST)
    
        def test_password_too_short(self):
            """Test that the password must be more thatn 5 characters"""
            payload = {'email': '[email protected]', 'password': 'pw'}
            res = self.client.post(CREATE_USER_URL, payload)
    
            self.assertEqual(res.status_code, status.HTTP_400_BAD_REQUEST)
            user_exists = get_user_model().objects.filter(
                email=payload['email']
            ).exists()
            self.assertFalse(user_exists)
    導入する部分がある程度できたら今から本格的に作りましょう
    2つの定数CREATE_USER_URLおよびTOKEN_URLを定義します.
    小文字を使わない理由は、テスト中に変数が全く変わらないので、大文字で定数にします.
    次に、両方とも逆()メソッドを使用します.「user:create」文字を追加すると、ハード入力urlと同じ結果になります.
    同様にトークンを作成するurlもTOKEN_URL変数を使用してurlを作成します.

    helper function👾


    次にアシスタント関数を作成しますテストでのみ使用できる関数を作成する必要があります.特にテストのたびに、重複するソースコードがたくさんあります.そんな時に使いました!できるだけ繰り返しを減らす!やつになる.
    ここでの方法は、テストのたびに各ユーザをソースコードに長時間書き込むのではなく、グローバル役割ドメインでhelper関数を定義し、UP!の再利用性を実現することである.create_user枚のアルバムとして定義また、復帰時にORMを利用してユーザーインスタンスを作成します
    因子は**kwargsでより生き生きとしています
    つまりget_user_model().objects.create_user(**params)という長いのはcreate_userで書いた短いほうがいいのです
    def create_user(**params):
        return get_user_model().objects.create_user(**params)

    Making class for test😛


    次のカテゴリを定義します.その理由はPublicvsPrivateの感覚で等級を区別するためです
    Prividは、誰でも(ログインしたかログインしていないか)、ログインした特定のユーザーをグループ化してテストするためです.
    また,このように区分すると,コードの直感性と清潔性がよい.
    また、setuupメソッドの内部にはself.client = APIClient()が定義されており、クライアントの呼び出しと使用をより柔軟かつ容易にすることができます.
    すなわち、テストのたびにAPIクライアント()クラスを割り当て、変数を定義する必要はありません.
    class PublicUserApitests(TestCase):👺
    	 """Test the users API (public)"""
    
        def setUp(self):
            self.client = APIClient()
           

    first test🙃


    Eメール、パスワード、名前を入力すると、テストコードを作成して会員を正常に登録できるかどうかを確認します.
    有効荷重ディクシャナ変数内でpostで会員加入を要請したときに伝えるデータを整理します.
    次いで、res = self.client.post(CREATE_USER_URL, payload)によってデータが定数として埋め込まれた第1のパラメータとして、負荷が第2のパラメータとして、データがpost要求として対応するエンドポイントに送信される.
        def test_create_valid_user_success(self):
            """Test creating user with valid payload is successful"""
            payload = {
                'email': '[email protected]',
                'password': 'testpass',
                'name': 'Test name',
            }
            res = self.client.post(CREATE_USER_URL, payload)
    
            self.assertEqual(res.status_code, status.HTTP_201_CREATED)
            user = get_user_model().objects.get(**res.data)
            self.assertTrue(user.check_password(payload['password']))
            self.assertNotIn('password', res.data)
    また、ポストリクエストで投げた場合、応答として201が届いたことを確認しますか?CREATE_USER_URLその部分がこれです
    ここで注目すべきは、2番目のパラメータがHTTP 201 CREATEDと定義されており、非常に直感的で、一目で何なのかがわかります.
    いずれにしても、assertEqual()の1番目と2番目のパラメータが同じであることを確認してください.
    次に、デバイスの暗号化パスワードが負荷のパスワードと同じであることを確認してください.
    次に、assertNotIn()メソッドを使用して、最初のパラメータがres.dataのキーとして存在するかどうかを確認します.パスワード情報は返信できませんので△暗号化されていても.

    second test


    会員入試は、プレイヤーが既に存在するかどうかを確認するためのテストです.
    ペイロードを書きます.
    次は重要だダイレクトコールelf.assertEqual(res.status_code, status.HTTP_201_CREATED)は、サーバにユーザ情報を登録する.
    次にクライアントからURL endpointにペイロードを送信し、post requestを送信して同じユーザ情報を持つユーザを生成する.
    もちろん400エラーですが、それを確認するためにAsserEqual()メソッドを使用してテストを行います.
     def test_user_exists(self):
            <"""Test creating a user that already exists fails"""
            payload = {'email': '[email protected]', 'password': 'testpass'}
            create_user(**payload)
    
            res = self.client.post(CREATE_USER_URL, payload)
    
            self.assertEqual(res.status_code, status.HTTP_400_BAD_REQUEST)
    

    third test


    3つ目のテストはパスワードが短い場合のテストです
    serializer.pyファイルのmeta領域で5文字を最小のmageルートに直接配置します.
    いずれにしてもpostリクエストで2文字のパスワードしか設定されていないので、サーバーで会員加入の有無を確認します.ORMメソッドでは、filterメソッドを使用してcreate_user(**payload)でクエリーが存在するかどうかを確認します.
    class UserSerializer(serializers.ModelSerializer):
        """Serializer for the users object"""
    
        class Meta:
            model = get_user_model()
            fields = ('email', 'password', 'name')
            extra_kwargs = {'password': {'write_only' : True, 'min_length': 5}}
        def test_password_too_short(self):
            """Test that the password must be more thatn 5 characters"""
            payload = {'email': '[email protected]', 'password': 'pw'}
            res = self.client.post(CREATE_USER_URL, payload)
    
            self.assertEqual(res.status_code, status.HTTP_400_BAD_REQUEST)
            user_exists = get_user_model().objects.filter(
                email=payload['email']
            ).exists()
            self.assertFalse(user_exists)
    完了したら、次のコマンドをコンソールに印刷してテスト結果を表示します.
    docker-compose run --rm app sh -c "python manage.py test"