Mockery1.0 クラス定数

クラス定数

クラスのテストダブルを生成するとき、Mockeryはモックするクラスの定数定義をスタブしません。そのため時々、クラス定数が存在しないため、テストのセットアップやアプリケーションのコード自身で望んでいない振る舞いを引き起こす可能性があります。PHP Fatal error: Uncaught Error: Undefined class constant 'FOO' in ...のPHPエラーさえ起きる可能性があります。

Mockeryでクラス定数をサポートするのは可能ですが、非常に多くの作業が必要なのに対し、使用されるケースはまれです。

それでも、Mockeryで現在サポートされている方法の、名前付きモックにより、定数を取り扱うことはできます。

名前付きモックはモックしたいクラス名を持つテストダブルですか、固定のレスポンスを含めた代理クラスを本当のクラスの代わりに裏でモックします。

次に、仮想ですが起こり得るシナリオをご覧ください。

class Fetcher
{
    const SUCCESS = 0;
    const FAILURE = 1;

    public static function fetch()
    {
        // Fetcherは何かをどこかから私達のために取得する…
        return self::SUCCESS;
    }
}

class MyClass
{
    public function doFetching()
    {
        $response = Fetcher::fetch();

        if ($response == Fetcher::SUCCESS) {
            echo "Thanks!" . PHP_EOL;
        } else {
            echo "Try again!" . PHP_EOL;
        }
    }
}

MyClassは、どこかにある、何かのリソース、たぶんリモートのWebサービスからファイルをダウンロードするFetcherを呼び出します。MyClassFetcher::fetch()の呼び出しのレスポンスに基づいてメッセージを出力します。

MyClassをテストする場合、テストスーツを実行するたびに、インターネットから何かがダウンロードされるFetcherを動かすのは、本当に好ましくありません。 ですから、モックしましょう。

// fetchは静的呼び出しなため、alias:を使う
\Mockery::mock('alias:Fetcher')
    ->shouldReceive('fetch')
    ->andReturn(0);

$myClass = new MyClass();
$myClass->doFetching();

これを実行すると、残念ながらテストは次のエラーになります。PHP Fatal error: Uncaught Error: Undefined class constant 'SUCCESS' in ..

この状況で、namedMock()が役立てられます。

Fetcherクラスのスタブを組んで、クラス定数をスタブします。それからnamedMock()を使用し、作成したスタブを元にFetcherという名前のモックを生成します。(訳注:実際にはmockメソッドの引数で指定しており、メソッドは呼び出されていません。)

class FetcherStub
{
    const SUCCESS = 0;
    const FAILURE = 1;
}

\Mockery::mock('Fetcher', 'FetcherStub')
    ->shouldReceive('fetch')
    ->andReturn(0);

$myClass = new MyClass();
$myClass->doFetching();

MockeryはFetcherStubを拡張し、Fetcherという名前のクラスを生成するため、これはうまく行きます。

Fetcher::fetch()が静的メソッドない場合でも、同じアプローチが取れます。

class Fetcher
{
    const SUCCESS = 0;
    const FAILURE = 1;

    public function fetch()
    {
        // Fetcherは何かをどこかから私達のために取得する…
        return self::SUCCESS;
    }
}

class MyClass
{
    public function doFetching($fetcher)
    {
        $response = $fetcher->fetch();

        if ($response == Fetcher::SUCCESS) {
            echo "Thanks!" . PHP_EOL;
        } else {
            echo "Try again!" . PHP_EOL;
        }
    }
}

テストは、次のようになります。

class FetcherStub
{
    const SUCCESS = 0;
    const FAILURE = 1;
}

$mock = \Mockery::mock('Fetcher', 'FetcherStub')
$mock->shouldReceive('fetch')
    ->andReturn(0);

$myClass = new MyClass();
$myClass->doFetching($mock);

ドキュメント章別ページ

概論

ヘッダー項目移動

注目:アイコン:ページ内リンク設置(リンクがないヘッダーへの移動では、リンクがある以前のヘッダーのハッシュを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)へ移動

その他

?

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