检查类是否具有使用PHPUnit定义的常量的正确方法

crm*_*cco 3 php testing phpunit unit-testing class-constants

我试图找出最佳或正确的方法来检查一个类是否有一个使用PHPUnit定义的常量.PHPUnit文档似乎没有涵盖这一点,这让我想知道我是否通过测试来做正确的事情 - 但它是我班级的一个重要特征.

我有以下课程:

PurchaseManager.php

/**
 * Message sent when a course has been purchased
 */
const COURSE_PURCHASED_MESSAGE = 'coursePurchasedMessage';
Run Code Online (Sandbox Code Playgroud)

...并且其部分测试类具有此测试:

PurchaseManagerTest.php

public function testCoursePurchasedMessageConstant()
{
    $pm = new PurchaseManager();
    $this->assertTrue(defined(get_class($pm) . '::COURSE_PURCHASED_MESSAGE'));
}
Run Code Online (Sandbox Code Playgroud)

它是否正确?它通过了,但我只是想知道这是否准确和最佳实践.

我正在使用PHPUnit 5.0.8.

BVe*_*rov 6

我正在使用Reflection类来实现此目的.它有getConstants返回关联数组的方法[<constant_name> => <constant_value>, ...].

就像是:

public function testHasSiteExportedConstant()
{
    $mailer = new \ReflectionClass(SiteExporter::class);
    $this->assertArrayHasKey('SITE_EXPORTED', $mailer->getConstants());
}
Run Code Online (Sandbox Code Playgroud)

  • 稍微好一点,因为更直接的方法是 `$this-&gt;assertTrue($mailer-&gt;hasConstant('SITE_EXPORTED')`。 (3认同)

Seb*_*ann 5

我永远不会测试常量,属性或方法的存在.当然,除非您正在测试代码生成器.

  • 你能解释一下原因吗? (3认同)
  • 我同意塞巴斯蒂安的观点,即您不应该测试事物的内部运作,而只是测试“接口”,即测试特定输入上的输出行为。但是,我来到这里是否要测试公共常量的存在(我知道这很糟糕,但是确实如此)。由于它是公开的,因此某种程度上它是一个相当大的接口,因此我对其进行了测试。 (2认同)