我只是前幾天有同樣的問題,我寫了一個庫,以欺騙的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()
方法模擬。
該庫是非常新的,因此某些功能可能會丟失。如果您使用它並錯過了某些內容,請提供具有所需功能的拉取請求。
爲什麼你需要爲了測試目的而模擬entity_manager,何時才能改變測試環境配置? – sensorario
這對我們來說還不夠。我們有各種各樣的數據庫功能測試,每個測試都會收到一個新的克隆數據庫。所以嘲笑實體管理器必須可能用於每個測試類,甚至測試方法。 –
使用fixtures和setUp()和tearDown()等,有更簡單和更好的方法去實現這個,而不是實際上'克隆'到一個實際的單獨數據庫中 –