我使用phpunit 4.8.23和laravel 5.2。
我的一个控制器正在抛出HttpException,如下所示。
throw new HttpException(403, 'auth_failure');
和Handler.php
if ($e instanceof HttpException){
return response()->json(array(...), $e->getStatusCode());
}
为了测试这个,我在我的测试文件中使用了以下代码。
1
/**
* @expectedException Symfony\Component\HttpKernel\Exception\HttpException
* @expectedExceptionMessage auth_failure
*/
public function testMethod(){....}
2
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(): {.....
我已经解决了this,this和this问题,但无法取得任何进展。
修改 我希望我已经提供了所有相关信息。无论如何,这是完整的方法
/**
* @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');
}
任何帮助表示赞赏:)
答案 0 :(得分:1)
我认为你将单元测试与功能测试混为一谈。当您运行功能测试时,您需要测试实际输出,例如header和html / json /如果您向&#39; / user&#39;发出POST请求,您将在浏览器中看到的任何内容。 API方法。
对于puse单元测试,您需要创建Controller并直接运行其方法,例如
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代码和内容)。你也可以在Handler.php中捕获HttpException,这样你就无法在测试中得到任何结果。您返回响应 - 它在您的测试中变为$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);
}
P.S。如果你想要一些例外 - 不要在Handler.php中捕获它,它将通过$result->response->exception
进行测试
如果我错了,请纠正我:)并且编码很好!