PHPフレームワーク Laravel実践開発 6章 メモ

Chapter 6 ユニットテスト

6-1 コントローラーのテスト

  • テスト関連ファイル説明
  • phpunit.xml 説明
  • Unit/Feature 説明
  • テスト実行方法: $vendor/bin/phpunit
  • Exampleソースの説明
  • コントローラーテスト
    • テストメソッド: assertXxx() 説明

6-2 モデルのテスト

  • テスト用DB準備、設定追加: config/database.php: connections => [ 'testing' => [] ]
  • マイグレーション作成
    • $ php artisan make:migration create_people_table
  • マイグレーション適用
    • $ artisan migrate:refresh --database=testing
  • シーディング作成
    • $ artisan make:seeder PeopleTableSeeder
    • シーディング呼び出し: /database/seeds/DatabaseSeeder.php を作成したSeederクラスを呼び出すよう変更
  • シーディング実行
    • $ artisan db:seed --database=testing
  • モデルテスト
    • tests/Feature/ExacpleTest.php へ記述
      • $this->assertDatabaseHas('<model-name>', $data), $this->assertDatabaseMissing('<model-name>', $data),
    • データベースを初期状態に戻す: use RefreshDatabase; // テストクラス内に記述
    • シードを利用し初期データ投入
      • $this->seed(DatabaseSeeder::class);

6-3 ファクトリの利用

  • ファクトリ作成
    • php artisan make:factory PersonFactory
  • ファクトリ定義
    • Model を書き換え、レコード生成部分を追記
  • ファクトリメソッドを概観
  • ファクトリを使ったテストコード記述
  • ステートを利用する
    • ファクトリへステート呼び出しを追加する
  • afterMaking, afterCreating, afterMakingState, afterCreatingState を利用する
    • ファクトリへ追記
    • make はモデルの作成
    • create はモデルが永続化される

6-4 モックの活用

  • ジョブのテスト
    • 実際のキューに影響を与えないように、Bus::fake() で、フェイク機能を起動する
    • ジョブがディスパッチされたことの確認
      • Bus::assertDispatched( ジョブクラス );
    • ジョブがディスパッチされていないことの確認
      • Bus::assertNotDispatched( ジョブクラス );
    • ディスパッチされたジョブの確認は、クロージャで行う
      • Bus::assetDispatched(ジョブクラス、function ($job) { / これが true を返せば、テスト通過 / });
  • イベントのテスト
    • 実際のイベントを使わず、Event::fake() で、フェイク機能を起動する
    • イベントがディスパッチされたことの確認
    • イベントがディスパッチされていないことの確認
    • コントローラー内で発生させたイベントの試験
  • キューのテスト
    • キューのフェイク機能
      • Queue::fake()
    • 指定のジョブが追加されていることを確認
      • Queue::assertPushed( ジョブクラス )
    • 指定のジョブが追加されていないことを確認
      • Queue::assertNothingPushed( ジョブクラス )
    • 名前付きキューでジョブが追加されていることを確認
      • Queue::assertPushed( 名前, ジョブクラス )
  • サービスのテスト
    • コントローラーにサービスをDIし、そのページを読み込んでテストを行う
    • モックでのテスト
      • モックを作成
        • $mock = Mockery::mock(PowerMyService::class);
        • できたモックのインスタンスへ、メソッドが呼ばれた場合の戻り値を指定してあげる。引数値も、呼び出し側コードと一致していなければならない
      • 戻り値を指定したモックのインスタンスを、クラスに設定する
        • $this->instance(PowerService::class, $mock);