gpt4 book ai didi

php - 用于单元测试的模拟 php 资源类型

转载 作者:可可西里 更新时间:2023-11-01 00:49:45 24 4
gpt4 key购买 nike

我必须为使用由我们使用的 apache 扩展创建的资源类型的 php 类编写测试,但假设它是一个具有 mysql 资源类型的数据库类。

显然我想模拟那些全局函数,但是如何在类检查资源创建是否正常时伪造返回类型?

php 文档中的资源页面甚至有一条评论提示模拟无法进行测试。这是最终答案吗?

假设我有(蹩脚的例子)代码:

class DB {
function init(){
$this->handle = mysql_connect('myserver');
if( get_resource_type($this->handle) != 'mysql' ) return false;
return true;
}
}

然后是通过模拟 mysql_connect 来测试成功和失败的测试。

最佳答案

也许你离得有点远。实际上,资源完全可以用 PHP 进行测试,您可以获得它们的类型等。pp..

不容易测试的是它们所代表的依赖关系。您通常不会注入(inject)这些资源,但您会围绕这些资源进行编码。我们称它为面向对象反转。

Central 是对象(资源),在过程风格中属于它的代码总是依赖于该资源。我们以 curl 为例:

$url = 'http://example.com/';
$handle = curl_init($url);
curl_exec($handle);

作为围绕 $handle 对象的这种过程风格,如果 curl 是某些其他代码的依赖项,那么从某种意义上说,用模拟替换功能是不可模拟的。所以你需要先把它包裹起来,让它可以注入(inject):

$url = 'http://example.com/';
$curl = new Curl($url);
$curl->exec();

这伴随着在普通旧 PHP 对象中转换以资源为中心的面向对象所需的代价:

class Curl
{
private $handle;
public function __construct($url) {
$this->handle = curl_init($url);
}
public function exec() {
return curl_exec($this->handle);
}
}

现在很容易模拟它。好消息是,这通常是可能的,所以通常资源本身不应该对测试施加任何限制,它只是缺少一些封装,因此您需要先添加它。

某些 API,如 imap 扩展,由于全局静态状态不允许创建干净的对象接口(interface),在 IMAP 扩展的情况下,它是错误处理。但它仍然越来越接近,如果缺陷被记录下来,那也会有所帮助。

关于php - 用于单元测试的模拟 php 资源类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10133426/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com