防止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 错误