Mockery1.0 パーシャルモックの生成

パーシャルモックの生成

パーシャル(部分)モックは、あるオブジェクトのいくつかのメソッドのみをモックし、残りは通常の呼び出し通り(つまり、実装されている通り)にレスポンスさせたい必要がある場合に便利です。Mockeryはパーシャル生成の明確な3つの戦略を実装しています。それぞれは特定の利点と欠点があるため、モックの必要に応じて、好みとソースコードに基づいて使用する戦略を選びます。

前にパーシャルテストダブル で少し取り扱っていますが、ここでもう少しこの主題を取り上げましょう。

  1. ランタイムパーシャルテストダブル
  2. 生成パーシャルテストダブル
  3. プロキシパーシャルモック

ランタイムパーシャルテストダブル

ランタイムパーシャルテストダブルは、パッシブパーシャルモックとしても知られていますが、これはモック対象のオブジェクトを一種のデフォルト状態として扱います。

$mock = \Mockery::mock('MyClass')->makePartial();

パーシャルを生成する場合、エクスペクションと一致するメッソッド呼び出しでない限り、親のクラス(MyClass)のオリジナルメソッドへ実行が渡されます。指定したメソッドコールと一致するエクスペクションがない場合、その呼び出しはモックしているクラスへ渡されます。呼び出しがモックされるか、されないかの境は、定義したエクスペクションに完全に依存するため、前もってモックするメソッドを定義する必要がありません。

ランタイムパーシャルテストダブルの使用例は、クックブックの大きな親クラスにあるエントリを参照してください。

Note: makePartial()メソッドは、最初にパーシャルモックのタイプとして導入された、オリジナルのshouldDeferMissing()メソッドと同じものです。shouldDeferMissing()メソッドについては、振る舞いモディファイヤーの章をご覧ください。(訳注:リンク先に情報は記述されていません。この注記は古い可能性があります。)

生成パーシャルテストダブル

生成パーシャルテストダブルは、伝統的なパーシャルモックとしても知られており、前もってモックするクラスのメソッドを定義しておき、残りはモックしません。伝統的なモックを作成する記法は以下のとおりです。

$mock = \Mockery::mock('MyClass[foo,bar]');

上記の例で、MyClassのfoo()bar()メソッドはモックされますが、MyClassのその他のクラスではしません。foo()bar()メソッドのモックでの振る舞いを指示するため、エクスペクションを定義する必要があります。

モックしないメソッドが関連する可能性があるため、コンストラクターの引数を渡せることを忘れないでください。

$mock = \Mockery::mock('MyNamespace\MyClass[foo]', array($arg1, $arg2));

詳細は、コンストラクターの引数セクションで確認してください。

Note: 生成パーシャルテストダブルをサポートしていますが、使用を推奨していません。

プロキシパーシャルモック

パーシャルの最後の種類は、プロキシパーシャルモックです。finalがマークされているため、あるクラスがモックできない事態に出会うことがあります。同様にあるクラスのメソッドで、finalがマークされているのを見つけることがあります。このようなシナリオでは、クラスをシンプルに拡張し、メソッドをモックするためにオーバーライドできません。解決するにはクリエイティブになる必要があります。

$mock = \Mockery::mock(new MyClass);

そうです。新しいモックはプロキシです。呼び出しを横取りし、エクスペクションに合わないメソッドは(生成し、引数で渡した)オブジェクトへ引き渡します。プロキシは制限を受けていないため、これにより間接的にfinalがついているメソッドをモックできるのです。トレードオフは明らかです。プロキシパーシャルは、モックしているクラスのタイプヒントのチェックに失敗します。クラスは拡張できないからです。

特別な内部クラス

プロキシパーシャルを除く、全てのモックオブジェクトで、passthru()呼び出しエクスペクションを使用し、背後の本当のクラスメソッドを呼び出せます。戻り値は実際のクラスから返され、モックされている戻り値のキューはバイパスされます。(ただ無視するわけです。)

内部使用のための、第4のパーシャルモックが存在しています。finalがマークされているメソッドを含むクラスをモックしようとすると、自動的に生成されます。なぜなら、そうしたメソッドはオーバーライドできないため、モックされずにただ残されてしまうからです。通常、これを意識する必要はありませんが、本当に、本当に、finalメソッドをモックする必要がある場合、唯一の可能性はプロキシパーシャルモックを通じて行います。たとえば、SplFileInfoがこの自動内部パーシャルが使用される一般的なクラスです。なぜなら、内部にpublicなfinalメソッドを含んでいるからです。

ドキュメント章別ページ

概論

ヘッダー項目移動

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

その他

?

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