PHP

Laravel PHPUnit テストの中でseederを利用する

Laravel

/onis/
https://localhost/api/v1.3/onis

{"onis" 
    {
        "id" : 1,
        "name": "muzansama",
        "kekkijutu": "tousou"
    },
    {
        "id" : 2,
        "name": "yushirou",
        "kekkijutu": "hacking"
    }
}

 

/onis/{oni_id}
https://localhost/api/v1.3/onis/2

{"onis" 
    {
        "id" : 2,
        "name": "yushirou",
        "kekkijutu": "hacking"
    }
}

 

 

 

class OniApisTest extends TestCase
{
    use DatabaseTransactions;
    private $oni;

    public function setup(): void
    {
        parent::setUp();
        $this->seed('OniTestDataSeeder');
        $this->oni = Oni::first();
    }

    /**
    * ログインなしでのアクセス確認 異常系
    *
    */
    public function testAuth()
    {
        // 鬼一覧ページ
        $response = $this->json('GET', '/api/v1.30/onis');
        $response->assertStatus(401)
                 ->assertExactJson([
                     'error' => [
                         'error_code' => 401001,
                         'message' => 'アクセストークンが必要です。'
                     ]
                 ]);

        // 鬼詳細ページ
        $targetId = $this->oni->getIdAttribute();
        $response = $this->json('GET', '/api/v1.30/onis/' . $targetId);
        $response->assertStatus(401)
                 ->assertExactJson([
                     'error' => [
                         'error_code' => 401001,
                         'message' => 'アクセストークンが必要です。'
                     ]
                 ]);
    }


    // onisオブジェクトがあるか確認 正常系
    public function testOnis()
    {
        $token = $this->createAccessToken();
        $response = $this->withHeaders([
                             'Content-Type' => 'application/json',
                             'Authorization' => 'Bearer ' . $token,
                         ])
                         ->json('GET', '/api/v1.30/onis');
        $this->assertTrue(array_key_exists('onis', $response->original));
    }

    /**
    * ログイン状態でのアクセス確認 正常系
    *
    */
    public function testOniById()
    {
        // oniオブジェクトがあるか確認 正常系
        $token = $this->createAccessToken();
        $targetId = $this->oni->getIdAttribute();
        $response = $this->withHeaders([
                             'Content-Type' => 'application/json',
                             'Authorization' => 'Bearer ' . $token,
                         ])
                         ->json('GET', '/api/v1.30/onis/' . $targetId);
        $this->assertTrue(array_key_exists('oni', $response->original));



        // キーの構成が厳密に正しいか 正常系確認
        $response->assertExactJson([
            'oni' => [
                'id' => $this->animal->getIdAttribute(),
                'name' => Normalizer::normalize($this->oni->name, Normalizer::FORM_C),
                'kekkijutu' => Normalizer::normalize($this->animal->getKiketuJutuAttribute(), Normalizer::FORM_C),
            ]
        ]);
        $response->assertStatus(200);
    }



    /**
     * 鬼詳細を取得時にString型文字列がリクエストされたら400001エラーを返却するか 異常系確認
     *
     * @return void
     *
     */
    public function testAnimalByIdNotIdButString()
    {
        $token = $this->createAccessToken();
        $badTargetId = (String) "花札の耳飾り・・・(ドキドキドキドキ))"; // 予期していない文字列型リクエスト
        $response = $this->withHeaders([
                             'Content-Type' => 'application/json',
                             'Authorization' => 'Bearer ' . $token,
                         ])
                         ->json('GET', '/api/v1.30/onis/' . $badTargetId);
        $response->assertJson([
            'error' => [
                'error_code' => 400001,
                'message' => 'リクエスト形式が間違っています。',
            ]
        ]);
        $response->assertStatus(400);
    }

 

テスト用トランザクション

 

テストの間だけテスト用のシードを流して、テスト終了で削除する

use Illuminate\Foundation\Testing\DatabaseTransactions; // ●ここポイント


class OniApisTest extends TestCase
{
    use DatabaseTransactions; // ●ここポイント

    public function setup(): void
    {
        parent::setUp();
        $this->seed('OniTestDataSeeder');
        $this->oni = Oni::first();
    }

 

 

テスト用のSeederファイル。

 

ログイン限定ページのアクセスでのエラーハンドリング確認

 

    /**
    * ログインなしでのアクセス確認 異常系
    *
    */
    public function testAuth()
    {
        // 鬼一覧ページ
        $response = $this->json('GET', '/api/v1.30/onis');
        $response->assertStatus(401)
                 ->assertExactJson([
                     'error' => [
                         'error_code' => 401001,
                         'message' => 'アクセストークンが必要です。'
                     ]
                 ]);

        // 鬼詳細ページ
        $targetId = $this->oni->getIdAttribute();
        $response = $this->json('GET', '/api/v1.30/animals/' . $targetId);
        $response->assertStatus(401)
                 ->assertExactJson([
                     'error' => [
                         'error_code' => 401001,
                         'message' => 'アクセストークンが必要です。'
                     ]
                 ]);
    }

 

正常系確認

 

  • 一覧情報
  • idを指定した詳細情報

 

    /**
    * ログイン状態でのアクセス確認 正常系
    *
    */
    public function testOniById()
    {
        // oniオブジェクトがあるか確認 正常系
        $token = $this->createAccessToken();
        $targetId = $this->oni->getIdAttribute();
        $response = $this->withHeaders([
                             'Content-Type' => 'application/json',
                             'Authorization' => 'Bearer ' . $token,
                         ])
                         ->json('GET', '/api/v1.30/onis/' . $targetId);
        $this->assertTrue(array_key_exists('oni', $response->original));



        // キーの構成を厳密に正しいか 正常系確認
        $response->assertExactJson([
            'oni' => [
                'id' => $this->animal->getIdAttribute(),
                'name' => Normalizer::normalize($this->oni->name, Normalizer::FORM_C),
                'kiketujutu' => Normalizer::normalize($this->animal->getKiketuJutuAttribute(), Normalizer::FORM_C),
            ]
        ]);
        $response->assertStatus(200);
    }

 

 

予期しないリクエストによる異常系確認

 

    /**
     * 鬼詳細を取得時にString型文字列がリクエストされたら400001エラーを返却するか 異常系確認
     *
     * @return void
     *
     */
    public function testAnimalByIdNotIdButString()
    {
        $token = $this->createAccessToken();
        $badTargetId = (String) "花札の耳飾り・・・(ドキドキドキドキ))"; // 予期していない文字列型リクエスト
        $response = $this->withHeaders([
                             'Content-Type' => 'application/json',
                             'Authorization' => 'Bearer ' . $token,
                         ])
                         ->json('GET', '/api/v1.30/onis/' . $badTargetId);
        $response->assertJson([
            'error' => [
                'error_code' => 400001,
                'message' => 'リクエスト形式が間違っています。',
            ]
        ]);
        $response->assertStatus(400);
    }

 

 

 

 

Amazonおすすめ

iPad 9世代 2021年最新作

iPad 9世代出たから買い替え。安いぞ!🐱 初めてならiPad。Kindleを外で見るならiPad mini。ほとんどの人には通常のiPadをおすすめします><

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)