惩戒/打桩该PHPUnit中实现了ArrayAccess一个类的一个对象(Mocking/Stubb

2019-07-29 09:40发布

这是我写一个测试套件(它扩展mysqli的)类的构造函数:

function __construct(Config $c)
{
    // store config file
    $this->config = $c;

    // do mysqli constructor
    parent::__construct(
        $this->config['db_host'],
        $this->config['db_user'],
        $this->config['db_pass'],
        $this->config['db_dbname']
    );
}

Config传递给构造类实现arrayaccess内置于PHP接口:

class Config implements arrayaccess{...}

如何嘲笑/存根Config对象? 我应该使用,为什么?

提前致谢!

Answer 1:

如果你可以轻松地创建一个Config从一个数组实例,这将是我的偏好。 当你想在哪里隔离实用,简单的合作者如来测试您的单位Config应该是足够安全的测试中使用。 设置它的代码可能会更容易读写(不易出错)比同等的模拟对象。

$configValues = array(
    'db_host' => '...',
    'db_user' => '...',
    'db_pass' => '...',
    'db_dbname' => '...',
);
$config = new Config($configValues);

话虽这么说,你嘲笑实施对象ArrayAccess就像你任何其他对象。

$config = $this->getMock('Config', array('offsetGet'));
$config->expects($this->any())
       ->method('offsetGet')
       ->will($this->returnCallback(
           function ($key) use ($configValues) {
               return $configValues[$key];
           }
       );

您还可以使用at强加访问的特定顺序,但是你让测试很脆的方式。



文章来源: Mocking/Stubbing an Object of a class that implements arrayaccess in PHPUnit