PHPUnit 不断言异常


PHPUnit not asserting Exceptions

我正在使用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在测试中可用

如果我错了,请纠正我:)并有一个很好的编码!