php - 模拟/ stub 一个在 PHPUnit 中实现 arrayaccess 的类的对象

标签 php phpunit arrayaccess

这是我正在为其编写测试套件的类的构造函数(它扩展了 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 类实现了 php 内置的 arrayaccess 接口(interface):

class Config implements arrayaccess{...}

如何模拟/ stub Config 对象?我应该使用哪个?为什么?

提前致谢!

最佳答案

如果您可以轻松地从数组创建 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 来强加特定的访问顺序,但那样会使测试变得非常脆弱。

关于php - 模拟/ stub 一个在 PHPUnit 中实现 arrayaccess 的类的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10607173/

相关文章:

javascript - Laravel - 将 JSON 响应包装在文本区域中

php - 使用 PHP `mysql_data_seek` 和代码而不是 SQL `LIMIT` 来限制分页结果是否明智?

php - 我可以提取函数返回值吗?

php - 将单个 SQL SELECT 语句查询结果分配给 PHP 变量

php - 如何在没有 fixture 的情况下在 Yii PHPUnit 测试中创建模型对象?

c++ - 在 C++11 及更高版本中,std::string::operator[] 是否进行边界检查?

php - 在 laravel 的测试套件中只运行一个单元测试

PHPUnit - 使用 $_POST 变量测试 MVC Controller

arrays - 用于访问一维数组的 Julia For 循环

php - 使用 SplObjectStorage 作为数据映射,是否可以使用可变数组作为数据?