测试调用静态方法的PHP代码

Eer*_*nen 6 php refactoring static phpunit unit-testing

我想测试这个必须调用静态类的代码块.

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

        // ... Do something to $foo

        return $foo;
    }
}
Run Code Online (Sandbox Code Playgroud)

我无法修改静态类.但是我可以更改模块内的代码.如何重构此代码以进行单元测试?

Eer*_*nen 4

将静态调用移动到一个单独的方法,然后对其进行模拟

重构代码:

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

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

        return $foo;
    }

    protected function getFoo() 
    {
        return FooFactory::getFoo();
    }
}
Run Code Online (Sandbox Code Playgroud)

测试代码:

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']);
}
Run Code Online (Sandbox Code Playgroud)