如何在进行单元测试时覆盖 php://input

2022-08-30 21:13:39

我正在尝试使用Zend和PHPUnit为控制器编写单元测试

在代码中,我从 php://input

$req = new Zend_Controller_Request_Http();
$data = $req->getRawBody();

当我测试实际应用程序时,我的代码工作正常,但除非我可以提供数据作为原始http post,否则$data将始终为空。getRawBody() 方法基本上调用file_get_contents('php://input'),但是我如何重写它以便为我的应用程序提供测试数据。


答案 1

我遇到了同样的问题,我修复它的方式是将字符串作为运行时可设置的变量。我知道这并不直接适用于这个问题,因为它需要修改Zend框架。但尽管如此,它可能对某人有所帮助。'php://input'

例如:

<?php
class Foo {

    public function read() {
        return file_get_contents('php://input');
    } 
}

会变成

<?php
class Foo {

    public $_fileIn = 'php://input';

    public function read() {
        return file_get_contents($this->_fileIn);
    }

}

然后在我的单元测试中,我可以做:

<?php
$obj = new Foo();
$obj->_fileIn = 'my_input_data.dat';
assertTrue('foo=bar', $obj->read());

答案 2

您可以尝试在单元测试中模拟该对象。像这样:

$req = $this->getMock('Zend_Controller_Request_Http', array('getRawBody'));
$req->method('getRawBody')
    ->will($this->returnValue('raw_post_data_to_return'));

推荐