剔除静态方法调用

时间:2013-09-03 16:00:23

标签: php phpunit static-methods stubbing

所以当测试开始爆炸时,我正在为PHPUnit编写测试。它的主要原因是Config :: get()抛出 - 类Core.class.php的未定义get()

这个类在测试中被调用:

class CoreTest extends PHPUnit_Framework_TestCase {

    protected $object;

    protected function setUp() {
        $this->object = new Core;
    }

    // .. other tests
}

所以我去研究了这个课,我发现这个结构有以下几点:

public function __construct() {        
    $this->absUrl  = Config::get(Config::ABS_URL);
    $this->baseDir = Config::get(Config::BASE_DIR);
    $this->session = new Session('core');
    return $this;
}

有没有办法可以将这些存在?或者以测试不爆炸的方式处理它们?

我正在阅读This information on stubbing static methods,但我不确定如何在此处应用它。感谢。

1 个答案:

答案 0 :(得分:2)

你必须模拟类,而不是执行构造函数,而是构建你需要的值,然后在测试中使用mock。

您有试过的样品吗?您可能需要修改Core()类以支持依赖注入(Config对象和Session对象)。

$stub = $this->getMock('Core');

// Configure the stub.
$stub->expects($this->any())
     ->method('CreateSession')
     ->will($this->returnValue('foo'));

$this->assertEquals('foo', $stub->CreateSession());

在您的示例代码中,您可能需要修改Core()类以接受要传递的Session和Config对象(通过构造函数或通过Set依赖项)以及对Session类的一些修改好。

class Core
{
    private $SessionObject;
    private $ConfigObject;
    public function __construct(Config $Config, Session $Session)           // Constructor Dependency
    {
        $this->ConfigObject = $Config;
        $this->absUrl  = $this->ConfigObject::get(Config::ABS_URL);
        $this->baseDir = $this->ConfigObject::get(Config::BASE_DIR);
        $this->session = $Session;
        $this->session->SetSessionType('core');
        return $this;
    }
}

class Core
{
    private $SessionObject;
    private $ConfigObject;
    public function __construct()           
    {
    }

    // Set Dependencies
    public function SetConfigObject(Config $Config)
    {
        $this->ConfigObject = $Config;
    }

    public function SetSessionObject(Session $Session)
    {
        $this->SessionObject = $Session;
    }

    public function BuildObject($SessionType)
    {
        $this->absUrl  = $this->ConfigObject::get(Config::ABS_URL);
        $this->baseDir = $this->ConfigObject::get(Config::BASE_DIR);
        $this->session->SetSessionType($SessionType);
    }
}

现在,您的生产代码将正确传递Config和Session对象,然后在测试中使用Mock对象传递具有所需状态的对象,以便在对象上调用get方法时返回硬设置值。 / p>