2017-06-07 83 views
7

我对依赖于需要在测试环境中嘲笑的第三方API的控制器进行了一系列测试。我们重写功能测试客户端爬虫,并嘲笑我们需要测试的依赖关系。这里的关键是,每次测试都会改变模拟。在控制器测试中覆盖Symfony 3.3容器服务

在Symfony的3.2这个工作不错,但在Symfony的3.3我有一些废弃警告,由于方式现在服务注入:

一个例子控制器测试用例:

class MyControllerTest extends WebTestCase 
{ 
    private static $kernelModifier = null; 

    public function setKernelModifier(\Closure $kernelModifier) 
    { 
     self::$kernelModifier = $kernelModifier; 
     $this->ensureKernelShutdown(); 
    } 

    protected static function createClient(array $options = [], array $server = []) 
    { 
     static::bootKernel($options); 

     if ($kernelModifier = self::$kernelModifier) { 
      $kernelModifier->__invoke(); 
      self::$kernelModifier = null; 
     }; 

     $client = static::$kernel->getContainer()->get('test.client'); 
     $client->setServerParameters($server); 

     return $client; 
    } 

    protected function getPropertyClient() 
    { 
     $mockService = (new PropertyMock())->getPropertyMock(); 
     $this->setKernelModifier(function() use ($mockService) { 
      static::$kernel->getContainer()->set('app.property_service', $mockService); 
     }); 
     return static::createClient(); 
    } 

    protected function getPropertyFailureClient() 
    { 
     $mockService = (new PropertyMock())->getPropertyFailureMock(); 
     $this->setKernelModifier(function() use ($mockService) { 
      static::$kernel->getContainer()->set('app.property_service', $mockService); 
     }); 
     return static::createClient(); 
    } 
} 

实际测试:

public function testInvalidPropertyRequest() 
{ 
    $client = $this->getPropertyClient(); 
    $client->request(
     'POST', 
     '/webhook/property', 
     [], 
     [], 
     [], 
     '' 
    ); 
    $this->assertEquals(400, $client->getResponse()->getStatusCode()); 
} 

的弃用错误:

Setting the "app.property_service" pre-defined service is deprecated since Symfony 3.3 and won't be supported anymore in Symfony 4.0: 3x

我已经通过了3.3版本的文档,BC的断开和弃用,并且无法弄清楚如何在配置完成后用mock替换容器服务。

任何帮助表示赞赏。

+0

也许这可以帮助你:https://stackoverflow.com/a/44948780/1652031 – TiMESPLiNTER

+0

@TiMESPLiNTER谢谢你。我们最终通过重构我们的测试来解决它,以便它们不再需要修改容器。 –

回答

2

我也遇到了这个问题,Container类中没有提示如何处理这个弃用。

//所有感兴趣的,有一个current issue在github上打开 - 但没有真正的解决方案,除了有更多的引导代码为您的单元测试或移动测试控制器孤立。 我建议将所有控制器定义为具有固定/定义的依赖性并且没有直接DIC使用的服务。

+1

他们承认,他们在[这个公关](https://github.com/symfony/symfony/pull/24418)上做得有点过头,所以我觉得依靠这个有点安全。 –