【问题标题】:Access class constant dynamically through dataProvider with PHPUnit 5.5.4使用 PHPUnit 5.5.4 通过 dataProvider 动态访问类常量
【发布时间】:2017-02-14 20:51:03
【问题描述】:

我有一堆类常量,我想在我的 PHPUnit 测试中检查它们的值。

当我运行此测试时,我收到以下错误:

1) CRMPiccoBundle\Tests\Services\MailerTest::testConstantValues 与 数据集“帐户验证”('ACCOUNT_VERIFICATION', 'CRMPicco.co.uk 帐户验证')错误:访问未声明 静态属性:CRMPiccoBundle\Services\Mailer::$constant

这是我的测试及其对应的dataProvider:

/**
 * @dataProvider constantValueDataProvider
 */
public function testConstantValues(string $constant, $expectedValue)
{
    $mailer = new Mailer();
    $this->assertEquals($expectedValue, $mailer::$constant);
}

public function constantValueDataProvider()
{
    return [
        'Account Verification' => [
            'ACCOUNT_VERIFICATION',
            'CRMPicco.co.uk Account Email Verification'
        ]];
}

这是在Mailer 中声明常量的方式:

const ACCOUNT_VERIFICATION = 'CRMPicco.co.uk Account Email Verification';

如何检查这个常量的值?

如果我在测试中执行$mailer::ACCOUNT_VERIFICATION,它会输出预期值,但我想使用 dataProvider 动态执行此操作。

【问题讨论】:

  • 你能在Mailer类中显示上述常量的声明吗?

标签: php unit-testing testing phpunit php-7


【解决方案1】:

ClassName::$propertyClassName 上查找名为property 的静态属性,而不是在$property 中存储名称的常量。 PHP 没有用于查找由字符串变量命名的常量的语法;您需要将类引用与constant() 函数结合使用。

例如:

/**
 * @dataProvider constantValueDataProvider
 */
public function testConstantValues(string $constant, $expectedValue)
{
    $classWithConstant = sprintf('%s::%s', Mailer::class, $constant);
    $this->assertEquals($expectedValue, constant($classWithConstant));
}

reflection 也可以这样做,但需要更多代码。

【讨论】:

  • 谢谢,是的,我最初尝试使用constant,但这导致了同样的错误(我尝试使用和不使用ReflectionClass
  • @crmpicco 我更新了我的答案,你需要用类名来引用它。在您的情况下可能吗?
猜你喜欢
  • 2018-06-25
  • 2015-03-28
  • 2013-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-14
相关资源
最近更新 更多