【问题标题】:Preventing phpunit from launching all functions防止phpunit启动所有功能
【发布时间】: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 的新手

标签: php symfony 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 自动装配它或其他服务做您无法控制的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-25
    • 1970-01-01
    • 1970-01-01
    • 2018-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多