Laravel4、開発パッケージのインストール

タグ: Laravel4  

@kinjou_jさんのブログにもありますが、テストのモックに使用するshouldReceiveメソッドはMockeryのモックを使用しています。もともと、このメソッド名は、Mockeryそのままです。ですから、Laravelらしい、簡潔なメソッド名ではありません。Mockeryの知識がある人であれば、お馴染みですので、使いやすくなっています。

ファサードを使っているコア、もしくは自前クラスは、Mockeryでの置き換えが簡単にできるようになっています。「簡単」という意味は、通常、モックへの置き換えは、依存を注入できるようにクラスを作成し、本物のクラスの代わりに、代用するスタブやモックを渡す手間が必要ですが、その手間なしに、モックへ置き換えることができることです。

そのためには、開発環境にMockeryを取り込む必要があります。マニュアルには「使っている」との記述はありますが、自前で取り込めとは明記されていません。私も勘違いしたので、ベータ時にIsssue出した覚えあるんですが、はねられました。

自動でインストールされないのには、理由があります。composer.jsonのrequireは実働、開発環境を選ばずインストールしたいパッケージを指定します。開発環境で必要な、PHPUnitとか、Mockeryをrequireに入れると、本番環境でもインストールされてしまいます。それを避けるため、自動では入れさせていないようです。(しかし、PHPUnitは、あたかも最初から入っているような記述が、ドキュメントに残っています。確かに、アルファ版の頃はインストールされていました。その名残です。まだ、修正されていません。)

ちなみに、Laravelのcomposer.jsonには、余すこと無く、使用する追加パッケージが全部指定されています。

    "require-dev": {
        "aws/aws-sdk-php": "2.2.*",
        "iron-io/iron_mq": "1.4.4",
        "pda/pheanstalk": "2.0.*",
        "mockery/mockery": "0.7.2",
        "phpunit/phpunit": "3.7.*"

Laravel自身をテストするような環境では、Laravelコアのルートディクレクトリーで"composer update"を実行すれば、composerのデフォルトは開発環境のため、"require-dev"で指定されている、使用するパッケージが全部インストールされます。しかし、プロジェクトでLaravelを使用する場合、プロジェクトのルートディレクトリーで、アップデートコマンドを実行しても取り込まれません。

"requre-dev"セクションは、アップデートコマンドを実行したディレクトリーに存在する、composer.json中で、直接指定されているものだけが有効になり、仮に依存パケージ中のcomposer.jsonで指定されていても、無視するからです。

ですから、開発環境向けに、テスト関係パッケージもインストールするには、プロジェクトルートのcomposer.jsonを開き、以下のように追加します。

    "require-dev": {
        "mockery/mockery": "0.7.2",
        "phpunit/phpunit": "3.7.*"
    },

後は、"composer update"をかければ、インストールされ、Mockeryによるモックの機能も使用できるようになります。

本番環境では、"require-dev"で指定したパッケージが取り込まれないように、"composer update --no-dev"と指定します。なかなかComposerは優秀で、一度、"require-dev"に指定したパッケージを取り込んだ後でも、"--no-dev"スイッチをつけると、削除してくれます。

つまり、本番環境へ開発環境からパッケージごと、まるまるコピーする場合であれば、"composer update --no-dev"をかければ、不要なパッケージは実働環境に残らないわけです。もちろん、必要なプロダクションコードだけを移して、"composer install --no-dev"で、パッケージを新たに取り込んでも、同じ結果になります。

ちなみに、Mockeryの日本語ドキュメントは、電子本のドキュメント+とTesting Decodedにおまけとして、荒訳版をつけています。現在、2冊Laravel関連の翻訳をしているので、それが終わり次第見直し、Web版としても公開します。