如何在不需要可选的PHP扩展的情况下创建非流资源以用于测试用例?

如何在不需要可选的PHP扩展的情况下创建非流资源以用于测试用例?,php,unit-testing,Php,Unit Testing,我需要创建一个resource类型的变量,它不是流。这意味着由fopen()等创建的资源已用完。理想情况下,应该可以在没有扩展帮助的情况下创建资源 我会使用SQLite内存数据库句柄,但SQLite是一个可选的PHP扩展(即使它在默认情况下已启用),不能保证安装在任何给定的系统上(例如,在当前的Ubuntu安装中,默认情况下不会安装SQLite扩展) 下面是一个测试用例的结构示例: function is_stream($resource) { // some code that deter

我需要创建一个resource类型的变量,它不是流。这意味着由fopen()等创建的资源已用完。理想情况下,应该可以在没有扩展帮助的情况下创建资源

我会使用SQLite内存数据库句柄,但SQLite是一个可选的PHP扩展(即使它在默认情况下已启用),不能保证安装在任何给定的系统上(例如,在当前的Ubuntu安装中,默认情况下不会安装SQLite扩展)

下面是一个测试用例的结构示例:

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()等函数。