イントロダクション

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はsessioncacheの設定ファイルをテスト環境で呼び出します。両方のドライバーはテスト環境では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メソッドをテストメソッドで呼び出して下さい。これにより、テストケースが実行されたことにより、サービスコンテナに追加されたモックのような追加結合をリセットします。