我有一个类,它有一个常量,可以通过类中的各种方法访问。它长期以来一直是一个常量(遗留代码),我们不想将其更改为常规变量,所以我坚持使用它。
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
]
我做错了什么吗?或者这不是常量映射的用途?
有办法实现我的要求吗?
谢谢
在您的代码中,您正在定义某些内容,然后打印其他内容,这就是为什么如果您想使用常量映射,您应该执行以下操作:
\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);
}
}