如何在测试用例中创建非流资源,而无需可选的PHP扩展?

时间:2011-08-23 12:31:40

标签: php unit-testing

我需要创建一个类型为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);
  }
}

2 个答案:

答案 0 :(得分:1)

stream_context_create()Docs创建一个严格来说不是流资源的资源。

以来,他们可能被视为不需要延期
  

从版本4.3.0开始,Streams是PHP不可或缺的一部分。无需任何步骤即可启用它们。

...尽管sqlite可能也是如此,所以你是否愿意接受它作为更好的选择取决于你。

此外,this page可能有所帮助。

答案 1 :(得分:1)

我也跑过List of Resource Types Docs并寻找可能与流无关的内容。大多数资源类型都需要扩展名或至少需要一个编译标志(如果你把文件系统输出)。

一个可能的候选人可能是socket_create()Docs

然而,由于目前还不清楚你在测试中想要实现什么(可能是模拟资源类型?),我不知道这是否正是你正在寻找的。您可能希望将测试代码添加到问题中,以使问题更加清晰。

修改

正如您已经澄清的那样,您要测试某个值是否为资源,然后您要检查资源类型:

$type = get_resource_type($var);

请参阅get_resource_type()Docsis_resource()Docs