2016-10-06 46 views
3

我有一堆類常量,我想檢查我的PHPUnit測試中的值。通過PHPUnit的dataProvider動態地訪問類的常量5.5.4

當我運行這個測試,我得到以下錯誤:

1) CRMPiccoBundle\Tests\Services\MailerTest::testConstantValues with data set "Account Verification" ('ACCOUNT_VERIFICATION', 'CRMPicco.co.uk Account Verification') Error: Access to undeclared static property: CRMPiccoBundle\Services\Mailer::$constant

這是我的測試及其相應的數據提供程序:

/** 
* @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做到這一點。

+0

你可以在'Mailer'類中顯示上述常量的聲明嗎? – BVengerov

回答

2

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,但具有更多的代碼。

+0

謝謝,是的,我最初嘗試使用'常量',但是這導致了相同的錯誤(並且我試過並且沒有'ReflectionClass'。 – crmpicco

+0

@crmpicco我更新了我的答案,您需要使用類名引用它。在你的場景? – Matteo