防止phpunit启动所有功能

Posted

技术标签:

【中文标题】防止phpunit启动所有功能【英文标题】:Preventing phpunit from launching all functions 【发布时间】:2021-08-31 07:00:27 【问题描述】:

如何防止phpunit启动我不想要的功能?

<?php

namespace App\Tests;

use App\Core\Security\ModuleService;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

class moduleTest extends WebTestCase

    /**
     * @var ModuleService
     */
    private ModuleService $moduleService;

    /**
     * moduleTest constructor.
     * @param ModuleService $moduleService
     */
    public function __construct(ModuleService $moduleService)
    
        $this->moduleService = $moduleService;
    
    
    public function testModule()
    
        $modules = $this->moduleService->getAllModules();
    





phpunit 尝试测试构造方法并崩溃

PHP 致命错误:未捕获的 ArgumentCountError:函数 App\Tests\moduleTest::__construct() 的参数太少,在第 138 行的 /vendor/phpunit/phpunit/src/Framework/TestBuilder.php 中传递了 0,而预期的正是 1在 /tests/moduleTest.php:20

更新

试着这样做

public function setUp(ModuleService $moduleService) : void
    
        $this->moduleService = $moduleService;
    

但是现在我收到了这个错误:

ArgumentCountError: 函数 App\Tests\moduleTest::setUp() 的参数太少,在第 1126 行的 /vendor/phpunit/phpunit/src/Framework/TestCase.php 中传递了 0,而预期正好是 1

【问题讨论】:

我认为您正在寻找的是 SetUp 函数而不是构造函数。 @DirkScholten 你能给我举个例子吗?我是 phpunit 的新手 【参考方案1】:

在测试中你不想使用构造函数。 Symfony 将尝试自动装配您不想要的服务,因为您希望能够模拟辅助服务。

为了防止这种情况,您删除构造函数并改用 setUp 函数。 PHPUnit 的工作方式是 setUp 函数总是在每次测试之前运行。所以在这里你将实例化你正在测试的服务(类)。

一个简单的setUp函数如下所示:

private ModuleService $moduleService;

public function setUp(): void

    $this->moduleService = new ModuleService();

然后在你的测试中你会像往常一样使用它们:

public function testStuff()

    $result = $this->moduleService->doStuff();
    $this->assertEquals('stuff', $result);

如果您正在测试的服务具有依赖项(大多数服务都有),您应该像这样模拟它们:

private ModuleService $moduleService;
private MockObject $dependancyServiceMock;


public function setUp(): void

    $this->dependancyServiceMock = $this->createMock(DependancyService::class);
    $this->moduleService = new ModuleService($this->dependancyServiceMock);

通过这种方式,您正在测试的服务与任何外部影响隔离,您可以完全控制它,而无需 Symfony 自动装配它或其他服务做您无法控制的事情。

【讨论】:

以上是关于防止phpunit启动所有功能的主要内容,如果未能解决你的问题,请参考以下文章

Laravel & PHPUnit : 允许进程隔离以防止 Mysql Too many connections 错误

phpunit随机重启测试

使用 chromedriver 跳过 phpunit 的所有测试

安装并使用PHPunit

Linux 下安装PHPunit

为 PHPUnit 创建一个基本测试类并将其扩展为常见功能会导致类未找到错误