应测试基于laravel-admin构建的后台功能而非其安装过程,重点覆盖权限控制、列表加载、表单提交等行为,区分功能测试与单元测试边界,mock框架依赖避免初始化失败。

laravel-admin 本身不是被测业务逻辑,它是一个后台管理框架——**你不需要、也不应该对 laravel-admin 的安装过程写单元测试**。真正该测的是:你基于它构建的后台功能是否按预期工作,比如权限控制是否生效、列表能否正确加载、表单提交是否触发对应模型操作等。
下面直奔实操重点:
安装后立刻验证 admin 路由和基础权限是否就绪
刚执行完 php artisan admin:install,别急着写业务,先确认环境没崩:
- 访问
/admin/login应返回 200,且页面含登录表单(不是 404 或 500) - 用默认账号
admin/admin登录后,能跳转到/admin首页,且左侧菜单可见 - 手动请求一个已注册的后台路由(如
/admin/users),未登录时应重定向到登录页,登录后应返回 200
这类验证属于「功能测试」,放在 tests/Feature/AdminAuthTest.php 中,用 $this->get('/admin/users')->assertRedirect('/admin/login') 即可覆盖。
测试你写的 AdminController 是否正确绑定模型和字段
laravel-admin 的核心是 Encore\Admin\Controllers\AdminController 子类,但它的行为高度依赖配置(form()、grid() 等方法)。单元测试无法直接断言这些 PHP 配置是否“渲染出正确 HTML”,但可以验证其底层行为:
- 调用
$controller->grid()->model()返回的是否是你预期的 Eloquent 模型类 - 调用
$controller->form()->getFormFields()是否包含你声明的字段名(如'title'、'status') - 对
form()->store()手动传入测试数据,检查是否成功创建记录并返回正确响应结构
注意:不要在单元测试里调用 $controller->index(),那会触发完整视图渲染,属于功能测试范畴;聚焦在控制器实例的方法返回值和副作用上即可。
绕过前端,直接测试 API 路由行为(推荐)
laravel-admin 默认不暴露 RESTful API,但你通常会在 routes/api.php 里补全,比如:
Route::middleware('auth:api')->get('/admin-api/users', [Api\UserController::class, 'index']);
这时你应该写功能测试,而不是测 laravel-admin 自身:
- 用
$this->actingAs($user, 'api')->getJson('/api/admin-api/users')验证认证与响应结构 - 用
assertJsonCount(10, 'data')断言分页数据量 - 用
assertDatabaseHas('users', ['name' => 'test'])配合工厂数据验证写入逻辑
关键点:这类测试必须启用 RefreshDatabase trait,并确保 phpunit.xml 中 DB_CONNECTION 指向 :memory: 或独立测试 SQLite,否则会污染开发库。
mock 掉 laravel-admin 内部依赖避免测试失控
某些场景下你会调用 Admin::user()、Grid::make() 等门面方法,它们依赖 session、request、view 等运行时上下文。在单元测试中直接调用会导致 Call to a member function user() on null。
解决方式是提前 mock:
- 在
setUp()中加\Encore\Admin\Facades\Admin::fake(); - 然后用
Admin::shouldReceive('user')->andReturn($mockUser);(需引入Mockery) - 或更轻量:直接在测试方法里绑定解析器
$this->app->instance('admin.user', $mockUser);
不 mock 就硬跑,90% 的失败不是你代码错了,而是 laravel-admin 的初始化链没走完——这不是 bug,是设计使然。
真正难的不是写断言,而是分清:哪些行为属于 laravel-admin 框架保证(不用测),哪些属于你写的配置和扩展(必须测)。越往视图层靠近,越该用功能测试 + 真实 HTTP 请求覆盖;越往模型和数据流靠近,越适合单元测试隔离验证。


















