我有symfony服务,它在某些方法中使用redis连接,但不是在所有方法中都使用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);
发布于 2013-11-01 20:40:50
创建ServiceA
模拟后,需要将其传递给客户机的容器(而不是内核的容器,因为客户机对象构建自己的内核)。试试这个:
$client = self::createClient();
$serviceA = $this->getMockBuilder('ServiceA')
->disableOriginalConstructor()
->getMock();
$client->getContainer()->set('my_bundle.service.a', $serviceA);
请注意,每次发出请求时都必须注入这个模拟的服务。这是因为客户端在每两个请求之间重新构建内核。
发布于 2013-11-01 20:05:11
你不应该模仿你的测试类,你应该模仿Redis类并注入它。
如果此测试不使用Redis,您甚至不需要配置mock。
$redis = $this->getMockBuilder('Redis')->disableOriginalConstructor()->getMock();
$serviceA = new ServiceA($redis);
发布于 2016-03-03 16:47:13
有一个特殊的工具可以处理模拟服务-- https://github.com/ramunasd/symfony-container-mocks
就像这样简单:
$service = static::$kernel->getContainer()->prophesize('my.custom.service');
https://stackoverflow.com/questions/19726281
复制相似问题