2017-06-02 58 views
8

在Symfony 3.3之前,允許將模擬服務設置到容器上。現在使用3.3,拋棄了警告,因爲服務已經預先定義好了。Symfony 3.3用於功能測試的服務模擬

覆蓋容器中的現有或預定義服務以設置功能測試的模擬服務的新標準方法是什麼?

E.g.在我們的例子中,我們設置了一個新的實體管理器,並新建了一個指向克隆數據庫的模擬連接進行測試。

$container->set('doctrine.orm.entity_manager', $testEm); 

設置「doctrine.orm.entity_manager」預定義的服務,因爲Symfony的3.3已被棄用,不會在Symfony的4.0不再支持。

+0

爲什麼你需要爲了測試目的而模擬entity_manager,何時才能改變測試環境配置? – sensorario

+0

這對我們來說還不夠。我們有各種各樣的數據庫功能測試,每個測試都會收到一個新的克隆數據庫。所以嘲笑實體管理器必須可能用於每個測試類,甚至測試方法。 –

+0

使用fixtures和setUp()和tearDown()等,有更簡單和更好的方法去實現這個,而不是實際上'克隆'到一個實際的單獨數據庫中 –

回答

0

我只是前幾天有同樣的問題,我寫了一個庫,以欺騙的Symfony的DIC:https://github.com/TiMESPLiNTER/proxy-mock

的想法是從「代理」,以覆蓋在config_test.yml服務原始服務類將所有調用重定向到模擬,然後可以在測試用例中動態設置。

# config_test.yml 
services: 
    timesplinter.proxy_mock.factory: 
     class: timesplinter\ProxyMock\ProxyMockFactory 

    acme.api.client: 
     factory: 'timesplinter.proxy_mock.factory:create' 
     arguments: ['Acme\AppBunde\Services\ApiClient'] 

這將覆蓋原始服務中定義的服務(xml | yml)及其代理。

在測試情況下,你就可以做這樣的事情:

// Your container aware test case (this exmaple is for PHPUnit) 
$mock = $this->getMockBuilder(ApiClient::class)->disableOriginalConstructor()->getMock(); 

$container->set('acme.api.client')->setMock($mock); 

有了這個測試將運行對您提供使用setMock()方法模擬。

該庫是非常新的,因此某些功能可能會丟失。如果您使用它並錯過了某些內容,請提供具有所需功能的拉取請求。