Mockery1.0 複雑な引数マッチング(on)

複雑な引数マッチング(on)

メソッド呼び出しで期待される引数のマッチングを複雑にする必要がある場合は、\Mockery::on()マッチャーを使うととても簡単です。引数としてクロージャーを受け付け、そのクロージャーへメソッド呼び出し時の引数が渡されます。クロージャーからtrueを返すと、Mockeryは引数がエクスペクションに一致したと取り扱い、「失敗した」値の場合は合致しなかったと考えます。

\Mockery::on()マッチャーは多くのシナリオで使用できます。複数のキー/値に基づいた配列の引数や、複雑な文字列のマッチングなどです。

たとえば、次のようなコードです。これは、さほど複雑ではありませんが、データベース上のpublishedフラッグを1にセットすることで、あるポストを公開済みにし、published_atへ現日時をセットします。

<?php
namespace Service;
class Post
{
    public function __construct($model)
    {
        $this->model = $model;
    }

    public function publishPost($id)
    {
        $saveData = [
            'post_id' => $id,
            'published' => 1,
            'published_at' => gmdate('Y-m-d H:i:s'),
        ];
        $this->model->save($saveData);
    }
}

テストでモデルをモックし、save()メソッドにエクスペクションを指定してみましょう。

<?php
$postId = 42;

$modelMock = \Mockery::mock('Model');
$modelMock->shouldReceive('save')
    ->once()
    ->with(\Mockery::on(function ($argument) use ($postId) {
        $postIdIsSet = isset($argument['post_id']) && $argument['post_id'] === $postId;
        $publishedFlagIsSet = isset($argument['published']) && $argument['published'] === 1;
        $publishedAtIsSet = isset($argument['published_at']);

        return $postIdIsSet && $publishedFlagIsSet && $publishedAtIsSet;
    }));

$service = new \Service\Post($modelMock);
$service->publishPost($postId);

\Mockery::close();

この例で重要なのは、\Mockery::on()マッチャーへ渡したクロージャーの内容です。 $argumentは実際には、save()メソッドが呼び出されたときの引数である、$saveDataです。この引数について、いくつかのことをチェックしています。

どれかの要件を満たさない場合、クロージャーはfalseを返し、メソッド呼び出しのエクスペクションは一致せず、MockeryはNoMatchingExpectationExceptionを投げます。

Note: このクックブックのエントリーは、Robertによるブログ記事である、"Complex argument matching in Mockery"を元に引用したものです。

ドキュメント章別ページ

概論

ヘッダー項目移動

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

その他

?

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