Laravel PhpUnit 依赖注入
Laravel PhpUnit Dependency Injection
我正在使用依赖注入来调用 Laravel 中的自定义服务,它工作正常。但是当我使用接口将这些依赖项注入我的 Phpunit 测试用例 classes 时,我收到以下错误:
Target [App\Services\Interfaces\CarServiceInterface] is not instantiable.
尽管接口已正确绑定到提供程序中的目标具体 class。
我使用了不同的样式,例如通过 __construct()
方法注入、注入测试方法甚至调用 app()
方法,但其中 none 有效。
测试文件:
private $carService;
public function setUp(): void
{
parent::setUp();
$this->carService = app(CarServiceInterface::class);
}
提供商:
$this->app->bind(
App\Services\Interfaces\CarServiceInterface::class,
App\Services\CarService::class
);
正确的做法是什么?
您需要在功能部分编写测试,因为功能测试继承自 laravel 基本测试用例,并且它们具有 CreatesApplication
特征。 Refer to here
之后,您可以在测试中使用 app('Your abstract class namespace ')
方法或 $this->app->make('Your abstract class namespace ')
简单地获取具体的 class 实例。
显然是错误的测试方法。
为什么在测试中需要 DI class?!
在测试 class 中,您必须准备 bind/mock 所需的 classes。
然后测试你的代码。
错误的第二部分说 class 没有正确绑定,尽管你假设了。
顺便说一句,如果你认为我错过了什么,而你需要 DI,请使用 bind
或 singleton
方法。
$this->app->bind(CarServiceInterface::class, fn () => $exampleInstance);
//or
$this->app->singleton(CarServiceInterface::class, fn () => $exampleInstance);
现在您可以像这样使用容器访问您的界面而不会出现 DI 错误:
$this->app[CarServiceInterface::class]
//or
$this->app->make(CarServiceInterface::class)
//or
app(CarServiceInterface::class)
好吧,我终于找到问题了。虽然别人给的都answers/suggesstion也是对的
我的测试用例 class 扩展了错误的 TestCase 命名空间。通过将其更改为 App\TestCase
它已得到修复。
我正在使用依赖注入来调用 Laravel 中的自定义服务,它工作正常。但是当我使用接口将这些依赖项注入我的 Phpunit 测试用例 classes 时,我收到以下错误:
Target [App\Services\Interfaces\CarServiceInterface] is not instantiable.
尽管接口已正确绑定到提供程序中的目标具体 class。
我使用了不同的样式,例如通过 __construct()
方法注入、注入测试方法甚至调用 app()
方法,但其中 none 有效。
测试文件:
private $carService;
public function setUp(): void
{
parent::setUp();
$this->carService = app(CarServiceInterface::class);
}
提供商:
$this->app->bind(
App\Services\Interfaces\CarServiceInterface::class,
App\Services\CarService::class
);
正确的做法是什么?
您需要在功能部分编写测试,因为功能测试继承自 laravel 基本测试用例,并且它们具有 CreatesApplication
特征。 Refer to here
之后,您可以在测试中使用 app('Your abstract class namespace ')
方法或 $this->app->make('Your abstract class namespace ')
简单地获取具体的 class 实例。
显然是错误的测试方法。 为什么在测试中需要 DI class?! 在测试 class 中,您必须准备 bind/mock 所需的 classes。 然后测试你的代码。
错误的第二部分说 class 没有正确绑定,尽管你假设了。
顺便说一句,如果你认为我错过了什么,而你需要 DI,请使用 bind
或 singleton
方法。
$this->app->bind(CarServiceInterface::class, fn () => $exampleInstance);
//or
$this->app->singleton(CarServiceInterface::class, fn () => $exampleInstance);
现在您可以像这样使用容器访问您的界面而不会出现 DI 错误:
$this->app[CarServiceInterface::class]
//or
$this->app->make(CarServiceInterface::class)
//or
app(CarServiceInterface::class)
好吧,我终于找到问题了。虽然别人给的都answers/suggesstion也是对的
我的测试用例 class 扩展了错误的 TestCase 命名空间。通过将其更改为 App\TestCase
它已得到修复。