Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 控制Symfony测试中的依赖项_Php_Symfony_Testing_Mocking_Symfony4 - Fatal编程技术网

Php 控制Symfony测试中的依赖项

Php 控制Symfony测试中的依赖项,php,symfony,testing,mocking,symfony4,Php,Symfony,Testing,Mocking,Symfony4,我对我的Symfony 4.2应用程序进行了多项边到边测试。我的意思是使用测试客户机发出web请求,然后对结果进行断言的测试。例如: public function testPageNotFound() { $client = $this->createClient(); $client->request('GET', 'does-not-exist'); $this->assertSame(404, $client->getResponse()-

我对我的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
,这样就不会发出真正的web请求。我如何告诉Symfony使用此双重测试

令人惊讶的是,在主测试文档中没有关于如何完成这个基本测试任务的信息

我尝试的一种方法是在
config/packages/test/services.yaml
中进行配置。这不起作用,据我所知是由于Symfony不允许覆盖services.yaml造成的,因为它加载了main
config/services.yaml
last:

最后,我只想遵循一些非常基本的测试最佳实践:

  • 在每次测试方法执行开始时初始化整个环境
  • 可能会更改特定服务和配置,使其脱离默认设置
  • 执行测试中的代码并对结果进行断言

  • 任何使用Symfony执行此操作的代码示例都将不胜感激。

    您应该能够通过在容器中交换服务来覆盖测试中的服务

    $this->container->getDefinition('x.x_服务')->setSynthetic(true);
    $this->container->set('x.x_服务',新的NullFileFetcher());
    
    需要更新文档:覆盖先前定义的最后一个文件是config/services\u test.yaml 这将帮助您解决您的用例。
    请参阅
    $kernel->getContainer()
    没有
    getDefinition
    方法或任何包含
    definition
    的方法。现在我知道了合成概念,我发现我可以把它放在我的
    服务中,这使得我的测试工作与测试加倍,但同时使生产代码失败,因为现在它不再按需构造
    文件获取程序
    。我已经将此与atymic他们的答案结合起来,并将服务更改为仅在测试模式下合成。效果很好。不过,我们也有兴趣看到一些由熟悉Symfony的人创建的真实项目中的
    服务\u test.yaml
    文件。你知道吗?