PHPUnit 如何模拟或更改类常量的值

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

我有一个类,它有一个常量,可以通过类中的各种方法访问。它长期以来一直是一个常量(遗留代码),我们不想将其更改为常规变量,所以我坚持使用它。

const SCHEMA_REPO = [
         "MailNotice" => MailNotice::class,
    ];

现在我正在尝试为访问此常量的方法编写测试。但我不想使用数组的任何值,我想使用测试值,所以我想知道是否可以在测试中更改

SCHEMA_REPO
的值。例如,我希望
SCHEMA_REPO
为:

const SCHEMA_REPO = [
         "TestNoticeA" => "TestNoticeA",
         "TestNoticeB" => "TestNoticeB",
    ];

我正在使用 PHPUnit 和 Mockery。在嘲笑文档中有一些叫做常量映射(https://docs.mockery.io/en/latest/cookbook/class_constants.html#constants-map)的东西,它应该允许您更改 const 中的 const 值测试类,但它不起作用。我的测试结果是:

\Mockery::getConfiguration()->setConstantsMap([
    Repo::class => [
        'TestNoticeA' => 'TestNoticeA',
    ]
]);

$mock = \Mockery::mock(Repo::class);
var_dump($mock::SCHEMA_REPO); // should be ['TestNoticeA' => 'TestNoticeA']

当我打印

$mock::SCHEMA_REPO
时,我期待看到
['TestNoticeA' => 'TestNoticeA']
,但我看到了
SCHEMA_REPO
的实际值:

[
         "MailNotice" => MailNotice::class
   ]

我做错了什么吗?或者这不是常量映射的用途?

有办法实现我的要求吗?

谢谢

php unit-testing testing phpunit
1个回答
0
投票

在您的代码中,您正在定义某些内容,然后打印其他内容,这就是为什么如果您想使用常量映射,您应该执行以下操作:

\Mockery::getConfiguration()->setConstantsMap([
    Repo::class => [
        'SCHEMA_REPO' => [
               'TestNoticeA' => 'TestNoticeA',
         ],
    ]
]);

$mock = \Mockery::mock(Repo::class);
var_dump($mock::SCHEMA_REPO); 

但你不必模拟常量!因为它们只是资源/装置,所以您应该只创建一个装置文件,然后从装置中获取该常量所需的值,如下所示:

class MyClass
{
    const SCHEMA_REPO = [
        "MailNotice" => MailNotice::class,
    ];
    public function myFunction(array $const = self::SCHEMA_REPO): void
    {
        // some functionality
    }
}

那么单元测试应该是这样的:

final class MyDataSourceTestFixture extends TestCase
{
    public function getMyDataMock(): array
    {
        return [
            [
                [
                    "MailNotice" => MailNotice::class,
                ]
            ],
        ];
    }
}

final class MyClassTest extends TestCase
{    
    /**
     * @dataProvider Test\fixture\MyDataSourceTestFixture::getMyDataMock()
     */
    public function testMyFunction(array $const): void
    {
        $mock = \Mockery::mock(MyClass::class);
        $mock->myFunction($const);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.