2016-03-15 77 views
2

我使用phpunit 4.8.23和laravel 5.2。PHPUnit不主张例外

我的控制器之一是抛出HttpException如下。

throw new HttpException(403, 'auth_failure'); 

和Handler.php

if ($e instanceof HttpException){ 
    return response()->json(array(...), $e->getStatusCode()); 
} 

为了测试这一点,我用在我的测试文件中的以下代码。

/** 
* @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也三号情况。

在任何情况下,我得到的输出

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

我已经throgh 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'); 
} 

任何帮助表示赞赏:)

+0

您能否发布您正在尝试运行的实际代码(即您的测试'testMethod'的完整代码)? –

+0

这里是实际的代码 –

+0

你是否试图直接在“testRegAuthFailure”内部抛出异常? – skz

回答

1

我想你混淆了与功能测试单元测试。当您运行功能测试时,如果您向'/ user'API方法发出POST请求,则需要测试实际输出,如标题和html/json /您将在浏览器中看到的任何内容。

对于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代码和内容)。你也可以在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); 
} 

附:如果你想期待一些例外 - 不要抓住它在Handler.php中,它将在测试中通过$result->response->exception

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

+0

它由laravel提供的测试框架,对不起,我之前没有提及它。 [Laravel Testing](https://www.laravel.com/docs/5.2/testing#testing-json-apis) –

+0

是的,我知道,它是为功能测试而创建的,所以期望控制器的异常不是如何需要被完成。无论如何,它建立在PHPUnit之上,因此phpunit的API可用 –