2011-08-05 109 views
3

有什麼不對下面的測試:PHPUnit的:數據提供程序問題

<?php 

class TestSomething extends PHPUnit_Framework_TestCase 
{ 
    /** 
    * @dataProvider provider 
    */ 
    public function testSomething($array, $expectedResult) 
    { 
     $this->assertEquals($array, $expectedResult); 
    } 

    public function provider() 
    { 
     return array(
      array(array(), array()), 
     ); 
    } 
} 

?> 

錯誤消息:

$phpunit index.php 
PHP Warning: Missing argument 1 for TestSomething::testSomething() in /var/www/tests/something-test/index.php on line 8 
PHP Warning: Missing argument 2 for TestSomething::testSomething() in /var/www/tests/something-test/index.php on line 8 
PHP Notice: Undefined variable: array in /var/www/tests/something-test/index.php on line 11 
PHP Notice: Undefined variable: expectedResult in /var/www/tests/something-test/index.php on line 11 
PHP Fatal error: Uncaught exception 'PHPUnit_Framework_ExpectationFailedException' with message 'Failed asserting that 
Array 
(
    [0] => Array 
     (
     ) 

    [1] => Array 
     (
     ) 

) 
is equal to <string:testSomething>.' in /usr/share/php/PHPUnit/Framework/Constraint/IsEqual.php:164 
Stack trace: 
#0 /usr/share/php/PHPUnit/Framework/Assert.php(2087): PHPUnit_Framework_Constraint_IsEqual->fail(Array, '') 
#1 /usr/share/php/PHPUnit/Framework/Assert.php(343): PHPUnit_Framework_Assert::assertThat(Array, Object(PHPUnit_Framework_Constraint_IsEqual), '') 
#2 /var/www/tests/something-test/index.php(11): PHPUnit_Framework_Assert::assertEquals('testSomething', Array) 
#3 /usr/share/php/PHPUnit/Framework/TestSuite.php(537): TestSomething->testSomething('testSomething', Array, 0) 
#4 /usr/share/php/PHPUnit/Framework/TestSuite.php(816): PHPUnit_Framework_TestSuite::createTest(Object(ReflectionClass), 'testSomething') 
#5 /usr/share/php/PHPUnit/Framework/TestSuite.php(224): PHPUnit_Framework_TestSuite->addTestMethod(Object(ReflectionClass), Object(Reflectio in /usr/share/php/PHPUnit/Framework/Constraint/IsEqual.php on line 164 

感謝。

+0

你確定沒有任何括號/大括號缺失嗎? –

+0

我看不到錯誤。謝謝。 – thom

回答

11

這是因爲你的測試也被作爲構造函數執行:

class TestSomething extends PHPUnit_Framework_TestCase 
{ 
    /** 
    * @dataProvider provider 
    */ 
    public function testSomething($array, $expectedResult) 
    { 
     $this->assertEquals($array, $expectedResult); 
    } 

    // ... 

} 

對於PHP4的兼容性,可以使用類名作爲方法名來聲明一個構造函數。它也以不區分大小寫的方式完成(即:testSomething()被認爲是TestSomething的構造函數)。如果你使用PHP預5.3.3

class SomethingTest extends PHPUnit_Framework_TestCase 
{ 
    // ... 
} 
+0

+1漂亮!我查找了一個構造函數,因爲我知道每個數據集都是如何傳入的,但完全忘了PHP4類名稱作爲構造函數。 –

+0

加油!這種構造器很爛! (謝謝,問題修復了!) – thom

+0

其他許多語言都使用這個類的名字作爲構造方法的名字,例如C++和Java –

0

:通常情況下,你將Test關鍵字附加到你的類名,以防止這種情況發生(而不是預謀)

你給的建立班級的變量? 因爲您的類和函數名稱(TestSomething/testSomething)是相同的(不區分大小寫)。 所以它將函數testSomething看作構造函數。

+0

實際上,這個行爲在5.3.3及更高版本中仍然存在,包括5.4 – netcoder

+0

他們應該刪除它!只需使用__constructor()而不是... – thom

+0

根據PHP網站(http://php.net/manual/en/language.oop5.decon.php)在示例#2它應該被視爲常規函數。 –

11

我也剛剛得到了很多相同的東西,我使用__construct()方法來設置內部變量。

我需要做的就是在function setUp() {}那裏發生。


我剛纔摔倒了這個問題再次 - 但這次的問題是註釋 - 我用了:

/* 
* @dataProvider .... 
*/ 

但評論已開始/**被認可。

+0

我的評論開始: /** + 主要錯字......浪費了30分鐘,發現問題... – Sam

+0

哇謝謝你,我用的是'__construct()'就好了永遠,直到我說的數據提供程序,那麼一切都炸燬了,這是解決一個噩夢。我可能永遠都不會想通了這一點,如果它是不適合你,謝謝! –

+0

/* VS/**是一個特別疑難雜症地獄。 – piersb

0

因爲phpunit運行數據提供程序函數作爲測試並顯示This test did not perform any assertions的「風險測試」標誌,似乎自phpunit 6(也許6.3?)phpunit不再忽略「測試」數據提供者函數中的前綴,例如testAdditionProvider。將其重命名爲additionProvider,如在current docs中的作品。 雖然我不是100%確定的。