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