LoginSignup
2024_Hello_World
@2024_Hello_World

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

phpunitでエラーが出る

解決したいこと

テストコードを通るようにしたい。

laravel sail バージョン11
PHPUnit バージョン12

メッセージ削除機能のFeatureテストでエラーが発生しています。
打ったコマンドは以下です。

 sail test tests/Feature/Tweet/DeleteTest.php

発生している問題・エラー

SQLSTATE[HY000] [1044] Access denied for user 'sail'@'%' to database 'testing' (Connection: mysql, SQL: select table_name as `name`, (data_length + index_length) as `size`, table_comment as `comment`, engine as `engine`, table_collation as `collation` from information_schema.tables where table_schema = 'testing' and table_type in ('BASE TABLE', 'SYSTEM VERSIONED') order by table_name)

該当するソースコード

DeleteTest.php
<?php

namespace Tests\Feature\Tweet;

use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use App\Models\Tweet;
use App\Models\User;
use Tests\TestCase;

class DeleteTest extends TestCase
{
    use RefreshDatabase;
    /**
     * A basic feature test example.
     */
    public function test_delete_successed(): void
    {
        $user  = User::factory()->create();  //ユーザーを作成
        $tweet = Tweet::factory()->create(['user_id' => $user->id]);  //つぶやきを作成

        $this->actingAs($user);  //指定したユーザーでログインした状態にする

        $response = $this->delete('/tweet/delete/' . $tweet->id);  //作成したつぶやきを指定。

        $response->assertRedirect('/tweet');
    }
}

phpunit.xml
<?xml version="1.0" encoding="UTF-8"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd"
         bootstrap="vendor/autoload.php"
         colors="true"
>
    <testsuites>
        <testsuite name="Unit">
            <directory>tests/Unit</directory>
        </testsuite>
        <testsuite name="Feature">
            <directory>tests/Feature</directory>
        </testsuite>
    </testsuites>
    <source>
        <include>
            <directory>app</directory>
        </include>
    </source>
    <php>
        <env name="APP_ENV" value="testing"/>
        <env name="APP_MAINTENANCE_DRIVER" value="file"/>
        <env name="BCRYPT_ROUNDS" value="4"/>
        <env name="CACHE_STORE" value="array"/>
        <env name="DB_DATABASE" value="testing"/>
        <env name="DB_HOST" value="mysql.test"/>
        <env name="MAIL_MAILER" value="array"/>
        <env name="PULSE_ENABLED" value="false"/>
        <env name="QUEUE_CONNECTION" value="sync"/>
        <env name="SESSION_DRIVER" value="array"/>
        <env name="TELESCOPE_ENABLED" value="false"/>
    </php>
</phpunit>

docker-compose.yml
#ここまで省略

mysql.test:
        image: 'mysql/mysql-server:8.0'
        environment:
            MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
            MYSQL_ROOT_HOST: '%'
            MYSQL_DATABASE: '${DB_DATABASE}'
            MYSQL_USER: '${DB_USERNAME}'
            MYSQL_PASSWORD: '${DB_PASSWORD}'
            MYSQL_ALLOW_EMPTY_PASSWORD: 1
        networks:
            - sail
        healthcheck:
            test:
                - CMD
                - mysqladmin
                - ping
                - '-p${DB_PASSWORD}'
            retries: 3
            timeout: 5s
    redis:
        image: 'redis:alpine'
        ports:
            - '${FORWARD_REDIS_PORT:-6379}:6379'
        volumes:
            - 'sail-redis:/data'
        networks:
            - sail
        healthcheck:
            test:
                - CMD
                - redis-cli
                - ping
            retries: 3
            timeout: 5s
# 以下省略

自分で試したこと

.envをコピーして .env.testingを作成する。
.env.testingにて、DB_DATABASE=testingに変更
テストDB用のキーを作成する
・docker-compose.ymlにテスト用の環境変数を追記
・phpunit.xmlでDB_HOSTの項目をmysql.testに変更

・.env.testingは不要とのことで削除しました

補足

データベースへのアクセスはできたが、データベースの初期化ができていないのかもしれない

解決済み

docker-compose.yml,phpunitなどの変更したところをもとに戻した。
https://laravel.com/docs/11.x/sail#running-tests
ドキュメントを参考にした。
余計な変更はいらなかったようです。

0

No Answers yet.

Your answer might help someone💌