【问题标题】:How to mock Symfony 2 service in a functional test?如何在功能测试中模拟 Symfony 2 服务?
【发布时间】:2013-11-12 15:00:41
【问题描述】:

我有 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);

【问题讨论】:

    标签: php unit-testing symfony mocking phpunit


    【解决方案1】:

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

    $client = self::createClient();
    
    $serviceA = $this->getMockBuilder('ServiceA')
        ->disableOriginalConstructor()
        ->getMock();
    
    $client->getContainer()->set('my_bundle.service.a', $serviceA);
    

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

    【讨论】:

    • 强调“你需要将它传递给客户端的容器(不是来自内核的容器)”。
    • $client->getContainer()->set('my_bundle.service.a', $serviceA) 是否暗示$container->get() 将不再实例化服务?我们想“覆盖”服务,但仍然希望容器在之后注入服务的依赖项。
    • 不,一旦你通过“set”方法设置对象,它就不会再实例化服务了。你需要自己照顾它。
    【解决方案2】:

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

    如果这个测试不使用 Redis,你甚至不需要配置 mock。

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

    【讨论】:

      【解决方案3】:

      有专门的工具可以处理模拟服务 - https://github.com/ramunasd/symfony-container-mocks

      就这么简单:

      $service = static::$kernel->getContainer()->prophesize('my.custom.service');
      

      【讨论】:

        【解决方案4】:

        你试过了吗?

        $serviceA = $this->getMock('ServiceA', array('getRequest'), array(), '', false);
        

        【讨论】:

          猜你喜欢
          • 2020-08-19
          • 1970-01-01
          • 1970-01-01
          • 2021-03-28
          • 1970-01-01
          • 2018-11-13
          • 1970-01-01
          • 2019-04-13
          • 2020-04-11
          相关资源
          最近更新 更多