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版としても公開します。