Laravel 4.2 テスト

イントロダクション

Laravelはユニットテストも考慮して作られています。実際、最初からPHPUnitを含んでおり、アプリケーションにはphpunit.xmlファイルを用意してあります。(訳注:現在はPHPUnitを取り込んでおらず、必要に応じてユーザーが読み込みます。)さらにPHPUnitに関してLaravelは、テスト時にブラウザーをシミュレートし、ビューを調査/操作できるように、SymfonyのHttpKernel、DomCrawler、BrowserKitコンポーネントを用意してあります。

サンプルのテストファイルがapp/testsディレクトリーに提供されています。新しいLaravelアプリケーションをインストールしたあとで、シンプルにphpunitをコマンドラインで実行し、テストしてみてください。

テスト定義と実行

テストケースを作成するには、app/testsディレクトリーにファイルを作成してください。テストケースはTestCaseを拡張してください。PHPUnitを使用する時と同様にテストメソッドを定義します。

テストケース例

class FooTest extends TestCase {

    public function testSomethingIsTrue()
    {
        $this->assertTrue(true);
    }

}

アプリケーションの全テストは、端末でphpunitコマンドを実行することにより行われます。

注意: setUpメソッドを定義する場合は、parent::setUpを確実に呼び出してください。

テスト環境

テスト実行時にLaravelは自動的に設定環境をtestingにセットします。そして、Laravelはsessioncacheの設定ファイルをテスト環境で呼び出します。両方のドライバーはテスト環境ではarrayにセットされます。これが意味するのはデータはテストを実行している間のみ存在しているということです。必要であれば、他のテスト設定環境を自由に作成することもできます。

テストからルートを呼び出す

テストからルートを呼び出す

テストでルートを呼び出すのは簡単で、callメソッドを使用します。

$response = $this->call('GET', 'user/profile');

$response = $this->call($method, $uri, $parameters, $files, $server, $content);

その後、Illuminate\Http\Responseオブジェクトを調べます。

$this->assertEquals('Hello World', $response->getContent());

テストからコントローラーを呼び出す

コントローラーをテストから呼び出すこともできます。

$response = $this->action('GET', 'HomeController@index');

$response = $this->action('GET', 'UserController@profile', array('user' => 1));

getContentメソッドはレスポンスのコンテンツ文字列を評価し、リターンします。ルートがビュー('View')をリターンするときは、originalプロパティーを使用し、アクセスできます。

$view = $response->original;

$this->assertEquals('John', $view['name']);

HTTPSルートを呼び出す場合、callSecureメソッドを使用します。

$response = $this->callSecure('GET', 'foo/bar');

注意:テスト中のtesting環境では、ルートフィルターは無効になっています。有効にするには、Route::enableFilters()をテストで使用してください。

DOMクローラー

コンテンツの内容を調べるために、ルートを呼び出し、DOMクローラー(Crawler)インスタンスを受け取ることも可能です。

$crawler = $this->client->request('GET', '/');

$this->assertTrue($this->client->getResponse()->isOk());

$this->assertCount(1, $crawler->filter('h1:contains("Hello World!")'));

どのようにこのクローラーを使用するかをもっと詳しく知りたい場合は公式ドキュメントを参照してください。

Facadesのモック

テストをしているとLaravelのstaticなfacadeの呼び出しのモックが必要となることが多いでしょう。例えば、次のコントローラーアクションを考えてみてください。

public function getIndex()
{
    Event::fire('foo', array('name' => 'Dayle'));

    return 'All done!';
}

Facadeに対しshouldReceiveメソッドを使用することで、Eventクラスの呼び出しをモックすることができます。これはMockeryのインスタンスをリターンします。

Facadeをモックする

public function testGetIndex()
{
    Event::shouldReceive('fire')->once()->with('foo', array('name' => 'Dayle'));

    $this->call('GET', '/');
}

注意:Request Facadeに対してモックは使わないでください。その代わりにテストを実行する場合は、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(array('name', 'age'));
}

直前の入力のデーターをアサートする

public function testMethod()
{
    $this->call('GET', '/');

    $this->assertHasOldInput();
}

ヘルパメソッド

TestCaseクラスはアプリケーションのテストを簡単にするために、いくつかのヘルパを用意しています。

テスト中でセッションを設定、フラッシュする

$this->session(['foo' => 'bar']);

$this->flushSession();

現在の認証中ユーザーをセットする

現在認証中のユーザーをセットしたい場合はbeメソッドを使用してください。

$user = new User(array('name' => 'John'));

$this->be($user);

データベースの内容を再構築したい場合は、seedメソッドを使用します。

テストでデータベースを再シードする

$this->seed();

$this->seed('DatabaseSeeder');

シードの作成についてはドキュメントのマイグレーションとシードの章をご覧ください。

アプリケーションのリフレッシュ

ご存知の通り、Laravelのアプリケーション、つまりIoCコンテナへは、テストメソッドの中から$this->appにより、いつでもアクセスできます。このアプリケーションインスタンスは、それぞれのテストクラスごとにリフレッシュされます。特定のメソッドでアプリケーションを強制的に手動リフレッシュしたい場合は、refreshApplicationメソッドをテストメソッドで使用して下さい。これにより、テストケースが実行されることによりIoCコンテナに追加されたモックのような追加結合をリセットします。

ドキュメント章別ページ

Artisan CLI

ヘッダー項目移動

注目:アイコン:ページ内リンク設置(リンクがないヘッダーへの移動では、リンクがある以前のヘッダーのハッシュをURLへ付加します。

移動

クリックで即時移動します。

バージョン

設定

適用ボタンクリック後に、全項目まとめて適用されます。

カラーテーマ
和文指定 Pagination
和文指定 Scaffold
Largeスクリーン表示幅
インデント
本文フォント
コードフォント
フォント適用確認

フォントの指定フィールドから、フォーカスが外れると、当ブロックの内容に反映されます。EnglishのDisplayもPreviewしてください。

フォント設定時、表示に不具合が出た場合、当サイトのクッキーを削除してください。

バックスラッシュを含むインライン\Code\Blockの例です。

以下はコードブロックの例です。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * ユーザに関連する電話レコードを取得
     */
    public function phone()
    {
        return $this->hasOne('App\Phone');
    }
}

設定を保存する前に、表示が乱れないか必ず確認してください。CSSによるフォントファミリー指定の知識がない場合は、フォントを変更しないほうが良いでしょう。

キーボード・ショートカット

オープン操作

PDC

ページ(章)移動の左オフキャンバスオープン

HA

ヘッダー移動モーダルオープン

MS

移動/設定の右オフキャンバスオープン

ヘッダー移動

T

最初のヘッダーへ移動

E

最後のヘッダーへ移動

NJ

次ヘッダー(H2〜H4)へ移動

BK

前ヘッダー(H2〜H4)へ移動

その他

?

このヘルプページ表示
閉じる