ことさら−古都プログラマーの更級日記

京都でお寺を回りながら御朱印集めをしていたり、LoLをしたり試合を見に行ったりしているエンジニアのブログです。技術的なはなしとか日常的なはなし、カメラやLoLや競馬の話も書きます。右メニューに検索やらカテゴリーやらがあるので、見たい記事だけ見てね!

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していたり、パーシャルモックを使わなきゃテストできあにようなことをしているコードが悪いのだが、過去の遺産となってしまったコードでは仕方がないこともある。

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

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

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

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

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

参考