1円でも得したいWebエンジニアの日常

クーポンだったりクレジットカードのポイントだったりを利用して1円でも得しつつ生活を便利にしていきたいWebエンジニアによるブログ。技術的な記事から商品レビューなど日常的なことまで。

PHP Mockeryでパーシャルモックなどを作る場合にコンストラクタがちゃんと呼ばれるようにしたい

Mockeryでパーシャルモックを作ることがある

<?php

class モックしたいクラス {

    public function __construct()
    {
        $this->repository = new Repository();
    }

    public function モックしたいメソッド() 
    {
    }

    public function モックしたくないメソッド()
    {
    }
}

// テスト

$mock = \Mockery::mock(モックしたクラス)->makePartial();
$mock->shouldReceive(モックしたいメソッド)
    ->andReturn($something);

しかしここで問題が出た。モックするとコンストラクタが呼ばれないので、$this->repository が new できなくてテスト中に死ぬ。

そもそも、コンストラクタの中でnewしていたり、パーシャルモックを使わなきゃテストできあにようなことをしているコードが悪いのだが、過去の遺産となってしまったコードでは仕方がないこともある。

コンストラクタを呼びたい場合はこうする

<?php

$mock = \Mockery::mock(モックしたクラス, [])->makePartial();

わかりやすく言うとこういうことだ

<?php

$mock = \Mockery::mock(モックしたクラス, [コンストラクタ引数1, コンストラクタ引数2, ...])->makePartial();

これでコンストラクタがきっちり呼ばれるようになり、$this->repositoryもちゃんとnewされるわけだ。めでたしめでたし。

参考