我有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连接)但是当构造函数将连接作为参数时,当我运行test时它尝试连接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);
答案 0 :(得分:59)
创建ServiceA
mock后,需要将其传递给客户端的容器(而不是内核的容器,因为客户端对象构建了自己的内核)。试试这个:
$client = self::createClient();
$serviceA = $this->getMockBuilder('ServiceA')
->disableOriginalConstructor()
->getMock();
$client->getContainer()->set('my_bundle.service.a', $serviceA);
请注意,每次提出请求时都必须注入此模拟服务。这是因为客户端在每两个请求之间重建内核。
答案 1 :(得分:5)
你不应该模拟你的测试类,你应该模拟Redis类并注入它。
如果Redis未用于此测试,则甚至无需配置模拟。
$redis = $this->getMockBuilder('Redis')->disableOriginalConstructor()->getMock();
$serviceA = new ServiceA($redis);
答案 2 :(得分:4)
有一种特殊工具可以处理模拟服务 - https://github.com/ramunasd/symfony-container-mocks
这很容易:
$service = static::$kernel->getContainer()->prophesize('my.custom.service');
答案 3 :(得分:0)
你试过吗?
$serviceA = $this->getMock('ServiceA', array('getRequest'), array(), '', false);