イントロダクション
Laravelはユニットテストも考慮して構築されています。実際、PHPUnitをサポートしており、最初から含まれています。アプリケーションのために、phpunit.xml
ファイルも最初から準備されています。
サンプルのテストファイルがtests
ディレクトリーに提供されています。新しいLaravelアプリケーションをインストールした後に、そのままphpunit
をコマンドラインで実行し、試してみてください。
テスト定義と実行
テストケースを作成するには、tests
ディレクトリーにファイルを作成してください。テストケースはTestCase
を拡張してください。それから通常はPHPUnitを使用して、テストメソッドを定義します。
テストケース例
class FooTest extends TestCase {
public function testSomethingIsTrue()
{
$this->assertTrue(true);
}
}
アプリケーションの全テストは、端末でphpunit
コマンドを実行することにより行われます。
setUp
メソッドを定義する場合は、parent::setUp
を確実に呼び出してください。
テスト環境
テスト実行時にLaravelは、設定環境を自動的にtesting
へセットします。そして、Laravelはsession
とcache
の設定ファイルをテスト環境で呼び出します。両方のドライバーはテスト環境ではarray
にセットされます。これが意味するのはデータはテストを実行している間のみ存在しているということです。必要であれば、他のテスト設定環境を自由に作成することもできます。
testing
環境変数は、phpunit.xml
ファイルの中で設定されています。
テストからルートを呼び出す
テストからルートを呼び出す
テストでルートを呼び出すのは簡単で、call
メソッドを使用します。
$response = $this->call('GET', 'user/profile');
$response = $this->call($method, $uri, $parameters, $cookies, $files, $server, $content);
その後、Illuminate\Http\Response
オブジェクトを調べます。
$this->assertEquals('Hello World', $response->getContent());
テストからコントローラーを呼び出す
コントローラーをテストから呼び出すこともできます。
$response = $this->action('GET', 'HomeController@index');
$response = $this->action('GET', 'UserController@profile', ['user' => 1]);
注目:
action
メソッドを使うときにも、コントローラーの完全な名前空間を指定する必要はありません。App\Http\Controllers
名前空間に続く以降のクラス名だけを指定してください。
getContent
メソッドはレスポンスのコンテンツ文字列を評価し、リターンします。ルートがビュー('View')をリターンするときは、original
プロパティーを使用し、ビューに渡した内容へアクセスできます。
$view = $response->original;
$this->assertEquals('John', $view['name']);
HTTPSルートを呼び出す場合、callSecure
メソッドを使用します。
$response = $this->callSecure('GET', 'foo/bar');
ファサードのモック
テストをしているとLaravelの静的なファサード呼び出しのモックが必要となることが多いでしょう。例えば、次のコントローラーアクションを考えてみてください。
public function getIndex()
{
Event::fire('foo', ['name' => 'Dayle']);
return '全部おしまい!';
}
ファサードに対しshouldReceive
メソッドを使用することで、Event
クラスの呼び出しをモックすることができます。これはMockeryのインスタンスをリターンします。
ファサードをモック
public function testGetIndex()
{
Event::shouldReceive('fire')->once()->with('foo', ['name' => 'Dayle']);
$this->call('GET', '/');
}
注意:
Request
ファサードに対してモックは使わないでください。その代わりにテストを実行する場合は、call
メソッドに希望する入力を渡してください。
フレームワーク関連
Laravelにはテストを多少簡単にするために、いくつかのassert
メソッドが用意されています。
レスポンスがOKであることを確認
public function testMethod()
{
$this->call('GET', '/');
$this->assertResponseOk();
}
レスポンス状態を確認
$this->assertResponseStatus(403);
レスポンスがリダイレクトであることを確認
$this->assertRedirectedTo('foo');
$this->assertRedirectedToRoute('route.name');
$this->assertRedirectedToAction('Controller@method');
ビューがデーターを持っていることを確認
public function testMethod()
{
$this->call('GET', '/');
$this->assertViewHas('name');
$this->assertViewHas('age', $value);
}
セッションにデーターが存在することを確認
public function testMethod()
{
$this->call('GET', '/');
$this->assertSessionHas('name');
$this->assertSessionHas('age', $value);
}
セッションがエラーを持っているか確認
public function testMethod()
{
$this->call('GET', '/');
$this->assertSessionHasErrors();
// 指定されたキーのエラーがセッションに存在するか確認…
$this->assertSessionHasErrors('name');
// 複数のエラーがセッションに存在するか確認…
$this->assertSessionHasErrors(['name', 'age']);
}
直前の入力のデーターの確認
public function testMethod()
{
$this->call('GET', '/');
$this->assertHasOldInput();
}
ヘルパメソッド
TestCase
クラスはアプリケーションのテストが簡単にできるように、ヘルパをいくつか用意しています。
テスト中でセッションの設定、フラッシュ
$this->session(['foo' => 'bar']);
$this->flushSession();
認証済みユーザーの設定
認証済みユーザーをセットしたい場合は、be
メソッドを使用してください。
$user = new User(['name' => 'John']);
$this->be($user);
データベースの内容を再構築したい場合は、seed
メソッドを使用します。
テストでデータベース初期値設定の再実行
$this->seed();
$this->seed('DatabaseSeeder');
初期値設定クラス(seed)の作成についてはドキュメントのマイグレーションと初期値設定の章をご覧ください。
アプリケーションのリフレッシュ
既にご存知の通り、Laravelのアプリケーション、つまりサービスコンテナへは、テストメソッドの中から$this->app
により、いつでもアクセスできます。このサービスコンテナインスタンスは、それぞれのテストクラスごとにリフレッシュされます。特定のメソッドでアプリケーションを強制的にリフレッシュしたい場合は、refreshApplication
メソッドをテストメソッドで呼び出して下さい。これにより、テストケースが実行されたことにより、サービスコンテナに追加されたモックのような追加結合をリセットします。