为什么我不能在 dusk 的测试用例中注入 class

Why I can't inject a class in a test case with dusk

我正在用 dusk 测试我的 laravel 项目。

我正在尝试在这样的测试中注入依赖项:

....
class PasswordLostTest extends DuskTestCase
{
    private $passwordResetRepository;
    
    public function __construct(PasswordResetRepository $passwordResetRepository)
    {
        $this->passwordResetRepository = $passwordResetRepository;
    }
.....

当我运行测试用phpartisandusk.\tests\Browser\PasswordLostTest.php, 我有这个错误:

致命错误:未捕获的 ArgumentCountError:函数参数太少 Tests\Browser\PasswordLostTest::__construct(),0 在 D:\Workspace\classified-ads-mpa\vendor\phpunit\phpunit\src\Framework\TestBuilder.[=33 中传递=] 在第 138 行,恰好在 D:\Workspace\classified-ads-mpa\tests\Browser\PasswordLostTest.php:20

中预期为 1

有什么问题吗?是因为我在测试脚本中吗?

TestCases 没有被容器实例化。其次,您的应用程序在调用安装程序之前未启动,首先调用构造函数。让你的例子在技术上是不可能的。而是在设置方法中使用 resolve()app()->make() 来执行您想要的操作。

您的应用已引导至父测试用例设置,因此调用 parent::setUp(); 必不可少。

public function setUp()
{
    parent::setUp();
    $this->passwordResetRepository = resolve(PasswordResetRepository::class);
}

解决方法如下:

public function setUp(): void
    {
        parent::setUp();
        $this->passwordResetRepository = resolve(PasswordResetRepository::class);
    }

警告:void 是强制性的。这就是它不起作用的原因!

非常感谢指导我解决这个问题的mrhn!