Laravel PHPUnit

設定

phpunit.xml

<?xml version="1.0" encoding="UTF-8"?>
<phpunit ~>
 <testsuites>
  <testsuite name="Unit">
   <directory suffix="Test.php">./tests/Unit</directory>
  </testsuite>
  <testsuite name="Feature">
   <directory suffix="Test.php">./tests/Feature</directory>
  </testsuite>
 </testsuites>
 <filter>
  <whitelist processUncoveredFilesFromWhitelist="true">
   <directory suffix=".php">./app</directory>
  </whitelist>
 </filter>
 <php>
  <server name="APP_ENV" value="testing"/>
  ~
  <server name="DB_CONNECTION" value="テストで使用するコネクション名"/>
  <server name="DB_DATABASE" value="テストで使用するDB名"/>
  ~
 </php>
</phpunit>

実行

コマンド

プロジェクトディレクトリにて
./vendor/bin/phpunit

テストコード

テストクラス

※~Test.php
namespace Tests\Feature;

use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;

class ExampleTest extends TestCase
{
 public function test_PhpUnitController_index()
 {
  $response = $this->get('/test');

  $response->assertStatus(200);
 }

 public function test_PhpUnitController_json()
 {
  テスト2
 }
}

リクエスト

GET
$response = $this->get('/test');

POST(パラメータ無し)
$response = $this->post('/test');

POST(パラメータ有り)
$request = [
 'param1' => 1,
 'param2' => 'aaa',
];
$response = $this->post('/test', $request);

レスポンス

コンテンツ取得
$content = $response->content();

JSONコンテンツ変換
$json = json_decode($response->content());
$id = intval(json_decode($response->content())->{'id'});

Mock

use Mockery;

$mock = Mockery::mock(モッククラス::class);
$mock
  ->shouldReceive('モックメソッド')
  ->withArgs([モックメソッド引数])
  ->once() // 一度だけ実行
  ->andReturn(モックメソッド戻り値);

$this->instance(モッククラス::class, $mock);

モックメソッドは↓のコントローラで実行される
$response = $this->post('/パス');

アサーション

ステータスコード
$response->assertStatus(200);

Json
$response->assertExactJson(
 [
  'item1' => 123,
  'item2' => 456,
 ]
);

イコール
$this->assertEquals($response->content(), 'AAAAA');

Follow me!

前の記事

Laravel Controller

次の記事

React