我在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。