首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在功能测试中模拟Symfony 2服务?

如何在功能测试中模拟Symfony 2服务?
EN

Stack Overflow用户
提问于 2013-11-01 19:55:48
回答 4查看 32.3K关注 0票数 30

我有symfony服务,它在某些方法中使用redis连接,但不是在所有方法中都使用redis连接。

代码语言:javascript
复制
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

代码语言:javascript
复制
$serviceA = $this->getMockBuilder('ServiceA')
    ->disableOriginalConstructor()
    ->getMock();

static::$kernel->getContainer()->set('my_bundle.service.a', $serviceA);
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-11-01 20:40:50

创建ServiceA模拟后,需要将其传递给客户机的容器(而不是内核的容器,因为客户机对象构建自己的内核)。试试这个:

代码语言:javascript
复制
$client = self::createClient();

$serviceA = $this->getMockBuilder('ServiceA')
    ->disableOriginalConstructor()
    ->getMock();

$client->getContainer()->set('my_bundle.service.a', $serviceA);

请注意,每次发出请求时都必须注入这个模拟的服务。这是因为客户端在每两个请求之间重新构建内核。

票数 65
EN

Stack Overflow用户

发布于 2013-11-01 20:05:11

你不应该模仿你的测试类,你应该模仿Redis类并注入它。

如果此测试不使用Redis,您甚至不需要配置mock。

代码语言:javascript
复制
$redis = $this->getMockBuilder('Redis')->disableOriginalConstructor()->getMock();
$serviceA = new ServiceA($redis);
票数 5
EN

Stack Overflow用户

发布于 2016-03-03 16:47:13

有一个特殊的工具可以处理模拟服务-- https://github.com/ramunasd/symfony-container-mocks

就像这样简单:

代码语言:javascript
复制
$service = static::$kernel->getContainer()->prophesize('my.custom.service');
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19726281

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档