我正在尝试在 Symfony 5 中设置秘密管理器。我遵循了秘密管理设置课程和如何保留敏感信息秘密文档。
\n\n我的应用程序现在正在触发:
\n\nFatal Error: Maximum execution time of 30 seconds exceeded\nEnvironment variable not found: "DATABASE_URL".\nRun Code Online (Sandbox Code Playgroud)\n\n正如文档所说,我DATABASE_URL从我的输出中删除.env并使用了php bin/console secrets:set DATABASE_URLwhich 输出:
[OK] Sodium keys have been generated at "config/secrets/dev/dev.*.public/private.php".\n\n\n !\n ! [CAUTION] DO NOT COMMIT THE DECRYPTION KEY FOR THE PROD ENVIRONMENT\xe2\x9a\xa0\xef\xb8\x8f\n !\n\n\n [OK] Secret "DATABASE_URL" encrypted in "config/secrets/dev/"; you can commit it.\nRun Code Online (Sandbox Code Playgroud)\n\n这是结果php bin/console secrets:list:
// Use "%env(<name>)%" to …Run Code Online (Sandbox Code Playgroud) 我有负责获取各种 api 来收集数据的应用程序。我使用 Codeception 作为我的测试框架,我需要在我的功能测试中模拟 API 客户端类,如下所示:
public function testFetchingNewApps(FunctionalTester $I) {
$request = new Request(
SymfonyRequest::METHOD_GET,
'https://url.com/get'
);
$apiClientMock = \Mockery::mock(HttpClientInterface::class);
$apiClientMock
->shouldReceive('send')
->with($request)
->andReturn(new Response(HttpCode::OK, [], '{"data":"some data"}'))
->once();
$symfony = $this->getModule('Symfony')->grabService('kernel')->getContainer()->set(HttpClientInterface::class, $apiClientMock);
$symfony->persistService(HttpClientInterface::class, false);
$I->runShellCommand('bin/console sync:apos --env=test');
}
Run Code Online (Sandbox Code Playgroud)
但是从 Symfony 4 开始,我们无法访问私有服务来模拟它们,我看到了类似的错误
服务是私有的,您无法替换它。
所以我发现我可以创建ApiClinetMock.php扩展真实ApiCLient.php文件和services_test.yml文件。并且在services_test.ymlI can make ApiClinetMock.phpas a public service 并将其与接口相关联(覆盖接口使用):
#services_test.yml
services:
_defaults:
public: true
Api\Tests\functional\Mock\ApiClientMock: ~
ApiHttpClients\HttpClientInterface: '@Api\Tests\functional\Mock\ApiClientMock'
Run Code Online (Sandbox Code Playgroud)
现在,当我运行我的测试用例时,我没有看到任何错误,例如
服务是私有的,您无法替换它。
但是我的模拟不起作用并返回真实数据而不是我在模拟中设置的数据,我不知道为什么。
可能的解决方案是覆盖我在 ApiClientMock 中需要的方法以返回我需要的数据,但它仅适用于一个测试用例,但我需要测试各种不同的有效/无效响应。
我知道 Symfony …