编写php测试来检查HTTP响应代码

时间:2014-03-13 15:19:42

标签: php unit-testing phpunit http-response-codes

我正在使用 phpunit 编写单元测试。

现在我想测试HTTP响应代码是预期的,即。类似的东西:

$res = $req->getPage('NonExistingPage.php', 'GET');
assertTrue($res->getHttpResponseCode(), 404);

我知道Symfony和Zend可以做到这一点。 但是,我在不使用任何框架的情况下开发了整个项目。而且,根据我的理解,如果想要使用这些框架,他必须改变他的项目以采用这些框架的默认项目结构。但我不想改变我的项目中的任何内容(甚至不是文件夹结构)。

那么有没有办法编写这样的测试(检查http响应代码)而不改变我现有的项目?

3 个答案:

答案 0 :(得分:1)

assert(strpos(get_headers('http://www.nonexistingpage.com')[0],'404') !== false) 

答案 1 :(得分:1)

虽然您不需要框架,但测试框架仍应使用Mock对象,然后您应该让代码相应地处理函数。例如,您的库需要对404错误执行某些操作。不要测试HTML错误代码是404,而是测试库的行为是否正确。

class YourHTTPClass
{
    private $HttpResponseCode;
    public function getPage($URL, $Method)
    {
        // Do some code to get the page, set the error etc.
    }

    public function getHttpResponseCode()
    {
        return $this->HttpResponseCode;
    }

    ...
}

PHPUnit测试:

class YourHTTPClass_Test extends \PHPUnit_Framework_TestCase
{
    public function testHTMLError404()
    {
        // Create a stub for the YourHTTPClass.
        $stub = $this->getMock('YourHTTPClass');

        // Configure the stub.
        $stub->expects($this->any())
             ->method('getHttpResponseCode')
             ->will($this->returnValue(404));

        // Calling $stub->getHttpResponseCode() will now return 404
        $this->assertEquals(404, $stub->getHttpResponseCode('http://Bad_Url.com', 'GET'));      
        // Actual URL does not matter as external call will not be done with the mock
    }

    public function testHTMLError505()
    {
        // Create a stub for the YourHTTPClass.
        $stub = $this->getMock('YourHTTPClass');

        // Configure the stub.
        $stub->expects($this->any())
             ->method('getHttpResponseCode')
             ->will($this->returnValue(505));

        // Calling $stub->getHttpResponseCode() will now return 505
        $this->assertEquals(505, $stub->getHttpResponseCode('http://Bad_Url.com', 
}

通过这种方式,您已经测试过您的代码将处理各种返回代码。使用模拟对象,您可以定义多个访问选项,或使用数据提供程序等...来生成不同的错误代码。

您将知道您的代码将能够处理任何错误,而无需转到外部Web服务来验证错误。

要测试获取数据的代码,您可以执行与实际模拟GET函数以返回已知信息类似的操作,以便测试获取结果的代码。

答案 2 :(得分:0)

  1. $ this-> assertEquals ($ expected,$ actual);
  2. 需要检查 $ res (不是 $ req - > getHttpResponseCode())
  3. 查看由$ req-> getPage(...)方法返回的类,并找到返回http代码的方法。