前提
laravelでテストコード(PHPUnit)を書いていますが、
処理の中でDBのテーブルにレコードをINSERTした後に、
デバッグで一時停止した状態でコマンドラインからテーブルをSELECTすると、
結果が反映されていない状態(レコード0件)で結果が返ってきます。(想定としてはSELECTの結果レコードが返ってくるはず)
use RefreshDatabase;をコメントアウトすると、想定通りレコードが返ってくるので、
RefreshDatabaseが関係していると思ったのですが、どうしても想定通りになりませんでした。
実現したいこと
デバッグで一時停止した状態でSELECTしたら、想定通りレコードが返ってくるようにしたいです。
または仕様として、レコードが返ってこない仕様なのであればそれを知りたいです。
意図
テストコード書くのは初心者です。
テストコードの中で、seeder等でテストデータを入れたりしたいので、
デバッグで一時停止して、DBの値を見ながらテストコードを書きたいと思った次第です。
(そもそもテストコードをデバッグするということ自体が間違っているのでしょうか・・?)
環境
MacBookAir macOS Monterey 12.4 Intel
Docker Desktop(ローカル開発・検証)
PHP 8.1.12
Laravel Framework 8.75
PHPUnit 9.5.10
Xdebug 3.2.0
検証用のプロジェクトリポジトリ(GitHub)
https://github.com/corock510/Experiment
該当のソースコード
UserTest.php
1<?php 2 3namespace Tests\Feature; 4 5use Illuminate\Foundation\Testing\RefreshDatabase; 6use Illuminate\Support\Facades\Log; 7use Tests\TestCase; 8 9use Illuminate\Support\Facades\DB; 10 11class UserTest extends TestCase 12{ 13 use RefreshDatabase; 14 15 /** 16 * A basic feature test example. 17 * 18 * @return void 19 */ 20 public function test_create_user() 21 { 22 //クエリビルダを用いて、usersテーブルに2件レコード追加(本来ここはテストコードではなくテスト対象のクラスのメソッドに書きますが、便宜的にここにINSERT処理を書いています。) 23 DB::table('users')->insert([ 24 ['name' => 'A', 'email' => '1@test.com', 'password' => 'aaa'], 25 ['name' => 'B', 'email' => '2@test.com', 'password' => 'aaa'] 26 ]); 27 28 //検証用 ブレークポイント usersテーブルにselect文流して$getValに代入 29 $getVal = DB::table('users')->select('name')->get(); 30 31 //検証用 ログ(src/storage/logs/laravel.log)に$getValの値を書き込み 32 Log::info($getVal); 33 34 //usersテーブルの件数が2件であればテストOK 35 $this->assertDatabaseCount(table: 'users', count: 2); 36 } 37}
詳細
上記のUserTest.phpでは、usersテーブルにレコードを2件INSERTし、その件数が2件であることをテストしています。
INSERT処理の直後(29行目)にブレークポイントを張ってデバッグで一時停止した状態で、コマンドライン上からMySQLに接続し、
usersテーブルにSELECT文を流すと、結果は2件のはずが、0件(Empty set)で返ってきます。
その後、UserTest.phpをステップ実行すると、想定通り2件取得できています。
冒頭でも書きましたが、13行目のuse RefreshDatabase;をコメントアウトすると、④で想定通り2件返ってきます。
検証手順
①拡張機能のxDebugをインストール済の状態で【cmd + shift + D】【F5】でxDebugを実行
②UserTest.phpの29行目selectの処理にブレークポイントを設定(Error Exception Uncaught Exceptionのチェックを外す)
③下記記載(1)の方法で、UserTest実行(②のブレークポイントで一時停止する)
④下記記載(2)の方法で、コマンドライン上でMySQLに接続して、usersテーブルにSELECT文を流す(結果は2件のはずが、0件(Empty set)で返ってくる)
⑤UserTest.phpの処理をステップ実行する(想定通り2件取得できている)
(1)UserTest実行
$ docker compose exec php bash
# ./vendor/bin/phpunit tests/Feature/UserTest.php
(2)DB接続、usersテーブルSELECT文発行
$ docker compose exec db mysql -u root -p
password
> use database;
> select name from users;
何卒、よろしくお願いいたしますm(_ _)m

回答1件
あなたの回答
tips
プレビュー