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,请使用 bindsingleton 方法。

$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 它已得到修复。