【发布时间】:2019-12-01 02:08:48
【问题描述】:
我为我的 Symfony 4.2 应用程序进行了许多边缘到边缘测试。我的意思是使用测试客户端发出 Web 请求然后对结果进行断言的测试。示例:
public function testPageNotFound() {
$client = $this->createClient();
$client->request('GET', 'does-not-exist');
$this->assertSame(404, $client->getResponse()->getStatusCode());
}
有没有办法在此类测试中更改服务容器中的特定服务?
示例问题:我的服务通过名为 FileFetcher 的抽象来发出 Web 请求。对于我的测试,我希望使用NullFileFetcher,这样就不会发出真正的网络请求。我如何告诉 Symfony 使用这个测试替身?
令人惊讶的是,在主要测试文档https://symfony.com/doc/current/testing.html 中没有关于如何执行此基本测试任务的信息。
我尝试的一种方法是在config/packages/test/services.yaml 中进行配置。这不起作用,据我所知是由 Symfony 不允许覆盖 services.yaml 引起的,因为它最后加载了主 config/services.yaml:https://symfony.com/doc/current/configuration.html#configuration-environments
最后我想做的就是遵循一些非常基本的测试最佳实践:
- 在每个测试方法执行开始时初始化整个环境
- 可能将特定服务和配置更改为远离默认设置
- 执行被测代码并对结果进行断言
任何使用 Symfony 的代码示例将不胜感激。
【问题讨论】:
标签: php symfony testing mocking symfony4