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
相关产品推荐
相关产品推荐

