6

静的クラスを呼び出す必要があるこのコード ブロックをテストしたいと思います。

class SomeModule {
    public function processFoo() 
    {
        $foo = FooFactory::getFoo();

        // ... Do something to $foo

        return $foo;
    }
}

静的クラスを変更できません。ただし、モジュール内のコードは変更できます。このコードを単体テスト可能にリファクタリングするにはどうすればよいですか?

4

2 に答える 2

4

静的呼び出しを別のメソッドに移動し、それをモックします

リファクタリングされたコード:

class SomeModule {
    public function processFoo() 
    {
        $foo = $this->getFoo();

        $foo['hoopla'] = 'doo';

        return $foo;
    }

    protected function getFoo() 
    {
        return FooFactory::getFoo();
    }
}

テストコード:

function testSomeModule() {
    // Whatever we want to simulate FooFactory::getFoo returning
    $foo = array('woo' => 'yay')

    // Create a copy of the class which mocks the method getFoo
    $module = $this->getMockBuilder('SomeModule')
                   ->setMethods(array('getFoo'))
                   ->getMock();

    // Rig the mock method to return our prepared sample
    $module->expects($this->once())
           ->method('getFoo')
           ->will($this->returnValue($foo));

    $result = $module->processFoo();

    $this->assertEquals('yay', $result['woo']);
    $this->assertEquals('doo', $result['hoopla']);
}
于 2013-02-26T08:53:07.433 に答える
1

静的クラス名をコンストラクタ パラメータとして渡す

リファクタリングされたコード:

class SomeModule {
    protected $factoryName;

    public function __construct($factoryName = 'FooFactory') {
        $this->factoryName = $factoryName;
    }

    public function processFoo() 
    {
        // PHP Parser limitation requires this
        $factoryName = $this->factoryName;
        $foo = $factoryName::getFoo();

        $foo['hoopla'] = 'doo';

        return $foo;
    }
}

テストコード:

public class MockFactory {
    static public function getFoo() {
        return array('woo' => 'yay');
    }
}

function testSomeModule() {
    $module = new SomeModule('MockFactory');
    $result = $module->processFoo();

    $this->assertEquals('yay', $result['woo']);
    $this->assertEquals('doo', $result['hoopla']);
}
于 2013-02-26T14:09:23.757 に答える