[英]Symfony Functional Testing - How to mock controller injected service with request(submit)
[英]How to mock Symfony 2 service in a functional test?
我有symfony服務,它在某些方法中使用redis連接,但在所有方法中都沒有。
class ServiceA
{
private $redis;
public function __construct($redis)
{
$this->redis = $redis;
}
public function getRequest($param1, $param2)
{
$result = $param1+ $param2;
return $request;
}
.. other methods which use $redis connection
}
我正在為僅使用getRequest方法的代碼編寫功能測試(此方法不需要redis連接)但是當構造函數將連接作為參數時,當我運行測試時它嘗試連接redis服務器。
如何編寫完全不使用redis連接的模擬服務並忽略原始構造函數。
我正在嘗試下面提到的方法,但沒有成功。 我仍然嘗試連接redis,盡管我已經禁用了原始構造函數。
http://blog.lyrixx.info/2013/04/12/symfony2-how-to-mock-services-during-functional-tests.html
$serviceA = $this->getMockBuilder('ServiceA')
->disableOriginalConstructor()
->getMock();
static::$kernel->getContainer()->set('my_bundle.service.a', $serviceA);
在創建ServiceA
mock之后,您需要將它傳遞給客戶端的容器(而不是來自內核的容器,因為客戶端對象構建了自己的內核)。 嘗試這個:
$client = self::createClient();
$serviceA = $this->getMockBuilder('ServiceA')
->disableOriginalConstructor()
->getMock();
$client->getContainer()->set('my_bundle.service.a', $serviceA);
請注意,每次發出請求時都必須注入此模擬服務。 這是因為客戶端在每兩個請求之間重建內核。
你不應該模擬你的測試類,你應該模擬Redis類並注入它。
如果Redis未用於此測試,則甚至無需配置模擬。
$redis = $this->getMockBuilder('Redis')->disableOriginalConstructor()->getMock();
$serviceA = new ServiceA($redis);
有一個特殊的工具,可以處理模擬服務 - https://github.com/ramunasd/symfony-container-mocks
這很容易:
$service = static::$kernel->getContainer()->prophesize('my.custom.service');
你有沒有嘗試過 ?
$serviceA = $this->getMock('ServiceA', array('getRequest'), array(), '', false);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.