在 php 7.2 测试中替换 Symfony 服务

问题描述 投票:0回答:1

我正在尝试将在 Symfony 3.3 和 php 7.1 上工作的应用程序升级到 php 7.2,但是当我运行 phpunit 时遇到大量 DEPRECATED 消息。最烦人的是:

“user.user_service”服务已经初始化,替换它自 Symfony 3.3 起已被弃用,并将在 4.0 中失败:7x

这是因为我在setUp方法中有这行:

$this->userService = $this->getMockBuilder(UserService::class)
    ->setMethods(['update'])
    ->getMock();
$container->set('user.user_service', $this->userService);

7x 是因为我在该课程中有 7 个测试用例,并且每个测试用例都会触发 setUp。我该如何处理这个问题?我无法删除这个模拟,因为它很重要。

我无法理解为什么 Symfony 准确地指向这个测试用例,因为我在所有测试中都以这种方式替换了很多服务。在这个setUp方法之前我没有在任何地方替换这个服务,所以这很奇怪。

php symfony phpunit php-7.2
1个回答
0
投票

您看到的弃用警告表明服务“user.user_service”在同一测试用例中被多次初始化,Symfony 警告您多次替换它已被弃用,并且在 Symfony 4.0 中将会失败。

在您的情况下,服务正在 setUp 方法中初始化,该方法在每个测试方法之前调用。由于类中有 7 个测试用例,因此该服务被替换了 7 次,从而导致弃用警告。

要解决此问题,您可以使用 setUpBeforeClass 方法而不是 setUp。在执行测试用例中的任何测试方法之前,仅调用 setUpBeforeClass 方法一次。这样,您就可以为类中的所有测试用例设置一次模拟服务。

这是一个例子:

class YourTestClass extends \PHPUnit\Framework\TestCase

{ 私有静态$userService;

public static function setUpBeforeClass(): void
{
    parent::setUpBeforeClass();

    // Create the mock service only once for all test cases
    self::$userService = self::getMockBuilder(UserService::class)
        ->setMethods(['update'])
        ->getMock();

    // Get the Symfony container and set the mock service
    $container = self::getContainer();
    $container->set('user.user_service', self::$userService);
}

// Rest of your test methods go here

}

确保将 getContainer() 替换为您在测试中用于获取 Symfony 容器的实际方法或途径。

通过这种方法,在执行任何测试方法之前仅设置模拟服务一次,从而消除了因在同一测试用例中多次替换同一服务而导致的弃用警告。

© www.soinside.com 2019 - 2024. All rights reserved.