我正在使用phpunit 4.8.23和laravel 5.2。
我的一个控制器正在抛出一个 HttpException,如下所示。
throw new HttpException(403, 'auth_failure');
和处理程序.php
if ($e instanceof HttpException){
return response()->json(array(...), $e->getStatusCode());
}
为了测试这一点,我在测试文件中使用了以下代码。
1
/**
* @expectedException Symfony'Component'HttpKernel'Exception'HttpException
* @expectedExceptionMessage auth_failure
*/
public function testMethod(){....}
阿拉伯数字
public function testMethod(){
$this->json(.....);
$this->setExpectedException('HttpException');
}
3 甚至尝试捕捉
try {$this->json(....)}
catch('Symfony'Component'HttpKernel'Exception'HttpException $e){..}
我也和'Exception
一起尝试了第 3 种情况。
在所有情况下,我得到的输出为
PHPUnit 4.8.23 by Sebastian Bergmann and contributors.
.Symfony'Component'HttpKernel'Exception'HttpException {#986
-statusCode: 403
-headers: []
#message: "auth_failure"
#code: 0
#file: "<path to file>"
#line: 103
-trace: {
57. App'Http'Controllers'DeviceController->register() ==> new Symfony'Component'HttpKernel'Exception'HttpException(): {.....
我已经解决了这个问题,这个问题和这个问题,但无法取得任何进展。
编辑我希望我已经提供了所有相关信息。无论如何,这是完整的方法
/**
* @expectedException Symfony'Component'HttpKernel'Exception'HttpException
* @expectedExceptionMessage auth_failure
*/
public function testRegAuthFailure()
{
$this->json('POST',
'auth',
[
"lang" => "us_en",
"data" => [
"identity" => "00000004",
"password" => "wrong",
]
]
);
$this->setExpectedException('HttpException');
}
任何帮助都值得赞赏:)
我认为您将单元测试与功能测试混为一谈。当您运行功能测试时,您需要测试实际输出,例如标头和html/json/如果您向"/user"API方法发出POST请求,您将在浏览器中看到的任何内容。
对于 puse 单元测试,您需要创建控制器并直接运行其方法,例如
class ControllerTest extends PHPUnit_Framework_TestCase {
/**
* @expectedException Symfony'Component'HttpKernel'Exception'HttpException
* @expectedExceptionMessage auth_failure
*/
public function testSomeMethod() {
$controller = new Controller(/* mocked dependencies */);
$controller->yourMethod();
}
}
另一方面,对于功能测试,我更喜欢测试实际响应(HTTP代码和内容)。此外,您在处理程序中捕获了HttpException.php因此您不能期望在测试中有任何异常。您返回响应 - 它在测试中变得$this->response
这对我有用:
// Handler.php
if ($e instanceof HttpException) {
return response()->json(array($e->getMessage()), $e->getStatusCode());
}
// Test
public function testRegAuthException()
{
$this->json('POST',
'auth',
[
"lang" => "us_en",
"data" => [
"identity" => "00000004",
"password" => "wrong",
]
]
)->seeJson(["auth_failure"]);
$this->assertEquals($this->response->getStatusCode(), 403);
// OR
// $this->assertResponseStatus(403);
}
附言如果你想期待一些异常 - 不要在处理程序中捕获它.php它将通过$result->response->exception
在测试中可用
如果我错了,请纠正我:)并有一个很好的编码!