PHPUnit 模拟对象和静态方法

2022-08-30 09:31:35

我正在寻找测试以下静态方法的最佳方法(特别是使用教义模型):

class Model_User extends Doctrine_Record
{
    public static function create($userData)
    {
        $newUser = new self();
        $newUser->fromArray($userData);
        $newUser->save();
    }
}

理想情况下,我会使用一个模拟对象来确保(使用提供的用户数据)并被调用,但这是不可能的,因为该方法是静态的。fromArraysave

有什么建议吗?


答案 1

PHPUnit的作者Sebastian Bergmann最近发表了一篇关于Stubbing和Mocking Static Methods的博客文章。使用 PHPUnit 3.5 和 PHP 5.3 以及一致使用后期静态绑定,您可以

$class::staticExpects($this->any())
      ->method('helper')
      ->will($this->returnValue('bar'));

更新:从 PHPUnit 3.8 开始弃用,并将在更高版本中完全删除。staticExpects


答案 2

现在有AspectMock库可以帮助解决这个问题:

https://github.com/Codeception/AspectMock

$this->assertEquals('users', UserModel::tableName());   
$userModel = test::double('UserModel', ['tableName' => 'my_users']);
$this->assertEquals('my_users', UserModel::tableName());
$userModel->verifyInvoked('tableName'); 

推荐