2016-10-04 75 views
2

在一個使用相同@dataProvider的兩個或多個測試的PHPUnit測試用例中,我希望提供程序找出它正在向哪個測試提供數據。我已經完成了這個使用debug_backtrace(),但這感覺不對。 PHPUnit是否提供了另一種更標準的方法來實現這一點?如果是,如何?如何找到數據提供者正在提供數據的測試?

<?php 

class MyTest extends \PHPUnit_Framework_TestCase { 

    /** @dataProvider dataProvider */ 
    public function testA() {} 

    /** @dataProvider dataProvider */ 
    public function testB() {} 

    public function dataProvider() { 

     $trace = debug_backtrace(false, 3); 
     $caller = $trace[2]['args'][2]; 

     // $caller === 'testA' or $caller === 'testB' 
    } 
} 
+0

爲什麼你需要那個?如果您需要不同的測試數據,請使用不同的提供商。如果數據之間有很多相似之處,請將它們提取到另一種方法中。 –

+0

我想自動化測試數據管理,我需要一個入口點來從文件中檢索數據。數據提供者不會保留測試用例的一部分,而是駐留在一個特徵中,該特徵旨在根據測試用例和正在執行的實際測試從文件系統獲取測試數據。 – hielsnoppe

+0

然後創建多個包裝器方法。 –

回答

2

創建調用基礎數據提供者的各個數據提供者。這樣您就知道調用者是什麼,並且仍然可以擁有一個入口點。

<?php 

class MyTest extends \PHPUnit_Framework_TestCase { 

    /** @dataProvider dataProviderA */ 
    public function testA() {} 

    /** @dataProvider dataProviderB */ 
    public function testB() {} 

    public function dataProviderA() 
    { 
     $dataProvider = $this->getProviderData(); 
     // Caller is A ... 
     // Mutate base provider data as necessary... 
    } 

    public function dataProviderB() 
    { 
     $dataProvider = $this->getProviderData(); 
     // Caller is B ... 
     // Mutate base provider data as necessary... 
    } 

    public function getProviderData() 
    { 
     // ... 
    } 
}