blog.fuktommy.com

ファクトリメソッドが楽しすぎる

PHPだと

(new Hoge())->fuga()

とかできないので、ファクトリメソッドにして

class Hoge
{
    public static function getInstance()
    {
        return new self();
    }
}
Hoge::getInstance()->fuga();

と、メソッドチェイン万歳なのですが、 テストでモックを使うときに便利だったり。

function foo($x)
{
    $hoge = new Hoge($x);
    return $hoge->fuga();
}

みたいな関数 foo() をテストしたい、 そのとき Hoge は本当の Hoge ではなく モックを使いたい、となったらどうするか。 まあ、この例でいえば foo($x) という関数が妙なので、 foo($hoge, $x) となるのがいいんじゃないかと思いますが、 例ですのでご容赦を。

class Hoge
{
    public static $mock = null;

    public static function getInstance()
    {
        if (self::$mock) {
            return self::$mock;
        } else {
            return new self();
        }
    }
}

function foo($x)
{
    $hoge = Hoge::getInstance($x);
    return $hoge->fuga();
}

function testFoo()
{
    Hoge::$mock = new HogeMock();
    foo($x);
}

テストケースで Hoge::$mock を設定してやれば、 Hoge::getInstance を使う箇所では モックかどうかを気にせずにコードが書けます。

Copyright© 1998-2014 Fuktommy. All Rights Reserved.
webmaster@fuktommy.com (Legal Notices)