PHPUnit没有声明异常

时间:2016-03-15 13:57:32

标签: php unit-testing phpunit laravel-5.2

我使用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(): {.....

我已经解决了thisthisthis问题,但无法取得任何进展。

修改 我希望我已经提供了所有相关信息。无论如何,这是完整的方法

/**
 * @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');
}

任何帮助表示赞赏:)

1 个答案:

答案 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进行测试

如果我错了,请纠正我:)并且编码很好!