具有代码覆盖率的Laravel5和PHPUnit:身份验证后的分段错误

时间:2016-04-07 09:58:33

标签: laravel-5 phpunit code-coverage

我在MAC OS X 10.9.5上的Laravel 5项目中使用PHPUnit和代码覆盖率。我为客户端配置文件页面编写了一个测试类,如下所示。

<?php

use Illuminate\Foundation\Testing\DatabaseMigrations;

class MinimalViewTest extends TestCase
{
    use DatabaseMigrations;

    public function testWithSegFault()
    {
        ...

        $this->actingAs($userAuthorized)
             ->visit('/clients/profile/x11')
             ->visit('/clients/profile/' . $randomUser->id);
    }
}

测试作为授权用户访问两个不同的页面。第一次访问/clients/profile/x11成功。但是,第二次访问以分段错误结束。

$ vendor/bin/phpunit -v tests/MinimalViewTest.php
PHPUnit 5.0.10 by Sebastian Bergmann and contributors.

Runtime:       PHP 7.0.0 with Xdebug 2.4.0
Configuration: /.../phpunit.xml

Segmentation fault: 11

如果我在没有代码覆盖的情况下调用PHPUnit,则测试成功。

$ vendor/bin/phpunit -v tests/MinimalViewTest.php --no-coverage
PHPUnit 5.0.10 by Sebastian Bergmann and contributors.

Runtime:       PHP 7.0.0 with Xdebug 2.4.0
Configuration: /.../phpunit.xml

.                                                                   1 / 1 (100%)

Time: 1.71 seconds, Memory: 16.00Mb

OK (1 test, 3 assertions)

除了Laravel 5提供的身份验证之外,我还使用自己的中间件来确定用户组。

Route::group(['middleware' => ['web', 'auth', 'usergroup'], 'groups' => ['admin', 'orgateam']], function ()
{
    Route::get('/clients/profile/{clientsId}', ['as' => 'clientsProfileByClientId', 'uses' => 'ClientsController@profileByClientId']);
});

我使用的中间件如下。

<?php

namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth as Auth;

class UserGroupMiddleware
{
    public function handle($request, Closure $next)
    {
        return $next($request);
    }
}

我可以将问题跟踪到引发分段错误的调用$next($request)。但是,我能够毫无问题地var_dump对象$next$request

我使用gdb查找有关分段错误发生原因的更多提示。它指向我

Program received signal SIGSEGV, Segmentation fault.
0x00007fff88a7fd13 in _platform_strcmp ()
   from /usr/lib/system/libsystem_platform.dylib

这里到底发生了什么? Laravel 5和PHPUnit代码覆盖率的验证确实存在问题吗?我真的很想使用代码覆盖和PHPUnit。

0 个答案:

没有答案