如何在不需要可选的PHP扩展的情况下创建非流资源以用于测试用例?
我需要创建一个resource类型的变量,它不是流。这意味着由fopen()等创建的资源已用完。理想情况下,应该可以在没有扩展帮助的情况下创建资源 我会使用SQLite内存数据库句柄,但SQLite是一个可选的PHP扩展(即使它在默认情况下已启用),不能保证安装在任何给定的系统上(例如,在当前的Ubuntu安装中,默认情况下不会安装SQLite扩展) 下面是一个测试用例的结构示例:如何在不需要可选的PHP扩展的情况下创建非流资源以用于测试用例?,php,unit-testing,Php,Unit Testing,我需要创建一个resource类型的变量,它不是流。这意味着由fopen()等创建的资源已用完。理想情况下,应该可以在没有扩展帮助的情况下创建资源 我会使用SQLite内存数据库句柄,但SQLite是一个可选的PHP扩展(即使它在默认情况下已启用),不能保证安装在任何给定的系统上(例如,在当前的Ubuntu安装中,默认情况下不会安装SQLite扩展) 下面是一个测试用例的结构示例: function is_stream($resource) { // some code that deter
function is_stream($resource)
{
// some code that determines whether input is stream
}
class StreamResourceTest extends PHPUnit_Framework_TestCase
{
public function testStreamResource()
{
$stream = fopen(__FILE__, 'r');
$nonStream = ???; // how can this be created?
$this->assertTrue(is_resource($stream));
$this->assertTrue(is_stream($stream));
$this->assertTrue(is_resource($nonStream));
$this->assertFalse(is_stream($nonStream));
fclose($stream);
}
}
创建严格意义上不是流资源的资源
可以认为它们不需要延长,因为
从4.3.0版开始,流是PHP不可或缺的一部分。启用它们不需要任何步骤
…虽然sqlite可能也是如此,但您是否愿意接受它作为更好的替代方案取决于您自己
还有,可能会有帮助。我也在跑过去,寻找一些可能与流无关的东西。大多数资源类型都需要一个扩展名或至少一个编译标志(如果您将文件系统输出)
一个可能的候选人可能是
然而,由于不清楚您在测试中试图实现什么(可能是模拟资源类型?),我不知道这是否正是您所寻找的。您可能希望将测试代码添加到问题中,以使问题更加清楚 编辑: 正如您所阐明的,您希望测试某个值是否为资源,然后检查资源类型:
$type = get_resource_type($var);
请参阅和。如果我问您为什么需要资源,但不需要对其执行任何特定操作,您是否介意?我不知道,但目录句柄可能不是流。但也许这是错误的。除了文件系统资源句柄之外,我不认为还有其他未绑定到扩展名的句柄。您可能希望将测试代码添加到问题中,以使问题更清楚。@DaveRandom:它专门用于类型检查。我需要一个测试用例的资源,该测试用例对于流类型的资源应该返回true,对于其他类型的资源应该返回false。@hakre:关于目录句柄是非流类型,您可能也是对的。谢谢。
socket\u create()?(P.S.为编辑喝彩,我一直想知道人们是怎么做的)不,资源类型名称是socket
,定义是socket handle
。我认为这是一场关于如何定义流资源的辩论-我想在这里说,它是一个允许您对其执行直接IO的资源,而不是一个与“Streams”扩展相关联的,但是我可能会错,这取决于你打开的套接字的类型。你们都提出了一些好的观点。在PHP中,流的定义似乎很松散。测试代码背后的思想基本上是类型断言。我想说‘确保这个变量是流,否则抛出异常’。现在,我不得不考虑流的确切组成,我不能100%确定我真正想要的是什么:)不过我想到了两个标准。能够像@DaveRandom所说的那样执行直接IO,并且能够在资源上使用stream_get_meta_data()等函数。