You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 10测试返回其他包视图的路由报错,如何解决?

问题:测试返回其他包视图的Laravel路由报错

基于Laravel 10构建了多包结构的CMS,包含核心包与UI包。核心包中定义了返回UI包视图的路由:

Route::get('php-test', function () {
   return view('my-cms::dashboard.home');
});

为测试该路由,已在核心包的composer.json中将UI包加入require-dev:

"require-dev": {
    "my-cms/ui": "dev-master"
},

编写的测试方法如下:

/** @test */
public function test_route_returns_view() : void
{
    $this->withoutExceptionHandling();
    
    $response = $this->get('php-test');
    $response->assertOk();
    $response->assertViewIs('my-cms::dashboard.home');
}

运行测试后抛出错误:

InvalidArgumentException: No hint path defined for [my-cms].

但UI包的ServiceProvider已注册视图命名空间:

public function boot() : void
{
    $this->loadViewsFrom(__DIR__ . '/../resources/views', 'my-cms');
}

请问如何测试返回其他包中视图的路由?


解决方案

1. 确保UI包ServiceProvider被自动发现

检查UI包的composer.json是否配置了Laravel自动发现规则,让框架能自动加载其ServiceProvider:

"extra": {
    "laravel": {
        "providers": [
            "MyCms\\Ui\\UiServiceProvider"
        ]
    }
}

配置完成后执行composer dump-autoload刷新自动加载缓存。

2. 在测试中手动注册UI包ServiceProvider

如果自动发现不生效,可在核心包测试类的setUp方法中手动注册UI包的ServiceProvider:

protected function setUp(): void
{
    parent::setUp();
    
    // 替换为UI包实际的ServiceProvider类路径
    $this->app->register(\MyCms\Ui\UiServiceProvider::class);
}

3. 模拟视图(避免依赖UI包)

若不想在测试中加载真实UI包,可模拟视图命名空间,创建空视图文件满足测试要求:

/** @test */
public function test_route_returns_view() : void
{
    $this->withoutExceptionHandling();
    
    // 注册模拟视图目录,目录中创建dashboard/home.blade.php空文件
    $this->app['view']->addNamespace('my-cms', __DIR__.'/../tests/MockViews');
    
    $response = $this->get('php-test');
    $response->assertOk();
    $response->assertViewIs('my-cms::dashboard.home');
}

内容的提问来源于stack exchange,提问作者madman2819

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 10:38:24