我正在使用 phpunit 编写单元测试。
现在我想测试HTTP响应代码是预期的,即。类似的东西:
$res = $req->getPage('NonExistingPage.php', 'GET');
assertTrue($res->getHttpResponseCode(), 404);
我知道Symfony和Zend可以做到这一点。 但是,我在不使用任何框架的情况下开发了整个项目。而且,根据我的理解,如果想要使用这些框架,他必须改变他的项目以采用这些框架的默认项目结构。但我不想改变我的项目中的任何内容(甚至不是文件夹结构)。
那么有没有办法编写这样的测试(检查http响应代码)而不改变我现有的项目?
答案 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)