gpt4 book ai didi

php - 如何模拟php ://input in PHP?

转载 作者:IT王子 更新时间:2023-10-28 23:53:38 26 4
gpt4 key购买 nike

我正在为我的 PHP 项目编写单元测试,

单元测试是模拟一个php://input数据,

我读了手册,上面写着:

php://input is a read-only stream that allows you to read raw data from the request body.

如何模拟 php://input,或者在我的 PHP 中编写请求体?


这是我的源代码和单元测试,都是简化的

来源:

class Koru
{
static function build()
{
// This function will build an array from the php://input.
parse_str(file_get_contents('php://input'), $input);

return $input;
}

//...

单元测试:

function testBuildInput()
{
// Trying to simulate the `php://input` data here.
// NOTICE: THIS WON'T WORK.
file_put_contents('php://input', 'test1=foobar&test2=helloWorld');

$data = Koru::build();

$this->assertEquals($data, ['test1' => 'foobar',
'test2' => 'helloWorld']);
}

最佳答案

使用测试替身

鉴于问题中的代码,最简单的解决方案是重构代码:

class Koru
{
static function build()
{
parse_str(static::getInputStream(), $input);
return $input;
}

/**
* Note: Prior to PHP 5.6, a stream opened with php://input could
* only be read once;
*
* @see http://php.net/manual/en/wrappers.php.php
*/
protected static function getInputStream()
{
return file_get_contents('php://input');
}

并使用测试替身:

class KoruTestDouble extends Koru
{
protected static $inputStream;

public static function setInputStream($input = '')
{
static::$inputStream = $input;
}

protected static function getInputStream()
{
return static::$inputStream;
}
}

然后测试方法使用测试替身,而不是类本身:

function testBuildInput()
{
KoruTestDouble::setInputStream('test1=foobar&test2=helloWorld');

$expected = ['test1' => 'foobar', 'test2' => 'helloWorld'];
$result = KoruTestDouble::build();

$this->assertSame($expected, $result, 'Stuff be different');
}

尽可能避免使用静态类

问题中场景的大部分困难是由于使用静态类方法引起的,静态类使测试变得困难。尽可能避免使用静态类并使用实例方法,这样可以使用mock objects 解决相同类型的问题。 .

关于php - 如何模拟php ://input in PHP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38197116/

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