gpt4 book ai didi

Laravel 单元测试自动依赖注入(inject)不起作用?

转载 作者:行者123 更新时间:2023-12-04 10:29:03 26 4
gpt4 key购买 nike

在 Laravel Framework 5.8.36 中,我正在尝试运行一个调用 Controller 的测试,其中 __construct 方法使用 DI,如下所示:

class SomeController extends Controller {

public function __construct(XYZRepository $xyz_repository)
{
$this->xyz_repository = $xyz_repository;
}

public function doThisOtherThing(Request $request, $id)
{
try {
return response()->json($this->xyz_repository->doTheRepoThing($id), 200);
} catch (Exception $exception) {
return response($exception->getMessage(), 500);
}
}
}

如果我通过浏览器运行代码或像 postman 中的 api 调用一样调用它,这工作正常,但是当我从我的测试中调用 doThisOtherThing 方法时,我收到以下错误:

ArgumentCountError: Too few arguments to function App\Http\Controllers\SomeController::__construct(), 0 passed in /var/www/tests/Unit/Controllers/SomeControllerTest.php on line 28 and exactly 1 expected

这告诉我,当我运行测试时,DI 由于某种原因无法工作。有任何想法吗?这是我的测试:

public function testXYZShouldDoTheThing()
{
$some_controller = new SomeController();
$some_controller->doThisOtherThing(...args...);
...asserts...
}

我尝试过在 app 的 setUp 方法中使用 bind 和 make 方法,但没有成功:

public function setUp(): void
{
parent::setUp();
$this->app->make('App\Repositories\XYZRepository');
}

最佳答案

没错。单元测试的整个想法是模拟依赖服务,以便您可以一致地控制它们的输入/输出。

您可以创建 XYZRepository 的模拟版本并将其注入(inject) Controller 。

$xyzRepositoryMock = $this->createMock(XYZRepository::class);
$some_controller = new SomeController($xyzRepositoryMock);
$some_controller->doThisOtherThing(...args...);

关于Laravel 单元测试自动依赖注入(inject)不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60497603/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com