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

标签 php unit-testing symfony mocking phpunit

我有 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 模拟后,您需要将其传递给客户端的容器(不是来自内核的容器,因为客户端对象构建自己的内核)。试试这个:

$client = self::createClient();

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

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

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

关于php - 如何在功能测试中模拟 Symfony 2 服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19726281/

相关文章:

java - 递归的性能

php - Twig:渲染 Controller 与宏

mysql - 如何使用 phpcr odm 制作嵌套 where 子句

symfony - 使用 Symfony 验证器组件时,约束违规始终为空

php - 一月份的重复天数

php - Laravel 关系/加入不工作

java - 如何对使用 session 窗口的 kafka 流应用程序进行单元测试

unit-testing - 带有 Spock Framework Mock "_"选项的 Groovy Spread Operator

php - 如何在 html 页面上显示从 android 应用程序发送到 php 的数据?

php - 前 30 天通过一个循环