2016-03-07 70 views
2

我有一個PHPUnit測試testFoo()與dataProvider fooProvider()。在testFoo()的開頭,我使用Runkit重新定義了一個方法,以便在該方法返回重新定義它返回的內容時測試預期結果。但是,重新定義該方法需要一點時間,所以我希望這個測試只發生一次。PHPUnit setUp使用dataProvider運行一個單獨的測試

是否PHPUnit框架提供的功能,以指定的代碼,我想以前testFoo()跑了一次,並且沒有一次通過fooProvider()或曾經在浴室返回每次測試(如setUp())的每個元素運行?

+0

怎麼樣[@BeforeClass(https://phpunit.de/manual/current/en/appendixes.annotations.html#appendixes.annotations.beforeClass)? – xmike

+0

@xmike我需要多次重新定義所述方法以針對不同的測試返回不同的東西,所以它確實需要針對單個測試 – thanksd

+0

而不是我將留在你的'@ before'之前,而是讓我自己的提供者在測試中進行測試像'$ dataSets = $ this-> getDataSets()'(應該返回數據的數組),然後用循環內的斷言循環它。這樣,測試將僅由PHPUnit框架啓動一次,所以'setUp()'也將只運行一次(從它的角度來看,測試將只運行一次)。 – xmike

回答

1

使用靜態私有屬性標記該方法已被重新定義。你需要它是靜態的,因爲測試類是爲dataProvider提供的每個case實例化的。

class FooTest extends PHPUnit_Framework_TestCase 
{ 
    private static $redefined = false; 

    /** 
    * @dataProvider fooProvider 
    */ 
    public function testFoo() 
    { 
     if (! self::$redefined) { 

      // redefinition code goes here 

      self::$redefined = true; 
     } 
    } 
} 
+0

我一直希望PHPUnit框架內的解決方案(我會編輯我的問題來澄清)。我在不同的測試中重新定義了相同的方法,並且不必手動跟蹤每個方法,是否已被重新定義並重新定義爲適合每種測試的替代方法。 – thanksd

+0

在這種情況下,您可以擁有一個處理方法重定義的類並在所有測試中使用。該類應該知道已經重新定義了哪些方法,並且在方法已經被重新定義的情況下不做任何事情。 – gontrollez

+0

這是行得通的,但這將是一種非常迂迴的方法,可以防止方法多次重新定義(與xmike在問題評論中的解決方法相比,或者與PHPUnit框架內類似於「setup()」的某些功能相比) – thanksd

相關問題