这是我正在为其编写测试套件的类的构造函数(它扩展了 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/