2015-06-14 105 views
1

我已經創建了一個與框架交互的方法,提取出具有完整狀態的訂單商品。如何對數據提取方法進行單元測試

但是,我怎麼能單元測試我的方法,以確保其能夠正常運行......

class A 
{ 
    public function extractData() 
    { 
     // extract data from framework 
     $dataCollection = FrameworkX->getDataCollection('sales/orders'); 
     $dataCollection->filter('state', 'complete'); 

     return $extractedData; 
    } 
} 


ClassATest 
{ 
    public function test_extracted_data_contains_only_items_with_complete_status { 
     $sut = new ClassA(); 
     $sut->extractData(); 

     // What is the assertion here? 
    } 

} 
+0

這不是單元測試,而是集成測試。 –

回答

2

您可以通過收集迭代,並斷言,每一個項目是在「完成」狀態。

但是你在這裏做什麼叫做integration test

你沒有測試你的方法(單元),但你測試框架的行爲(從存儲獲取數據)以及過濾方法的工作方式。

如果你想有一個單元測試看看這個article。您應該爲您的FramewokX->getDataCollection()方法創建存根。

如何測試與第三方的依賴

如果FrameworkX是最終的,那麼你可以聲明接口中的方法:

interface iDataSource 
{ 
    public function getDataCollection($path); 
} 

和一個新的類:

class DataSource implements iDataSource 
    { 
     public function getDataCollection($path) 
     { 
     //no need to test this method, it's just a wrapper 
     return FrameworkX->getDataCollection('sales/orders'); 
     } 
    } 

在你的A級創建a constructor

public function __construct(iDataSource $dataSource) 
{ 
    $this->dataSource= $dataSource; 
} 

並更改extractData方法以使用它。

public function extractData() 
{ 
    // extract data from framework 
    $dataCollection = $dataSource->getDataCollection('sales/orders'); 
    $dataCollection->filter('state', 'complete'); 

    return $extractedData; 
} 

讓我們假設您正在使用PHPUnit。

public function test_extracted_data_contains_only_items_with_complete_status() 
{ 
    // Create a stub for the DataSource class. 
    $stub = $this->getMockBuilder('DataSource') 
       ->getMock(); 

    // Configure the stub. 
    $stub->method('getDataCollection') 
     ->willReturn(preconfigured_collection_with_all_statuses_here); 

    $sut = new ClassA($stub); //create a new constructor and pass the stub 
    $sut->extractData(); 
    // and after that verify that your method filtered out non complete statuses 
} 
+0

那麼extractData方法不能被單元測試?如果用tdd方法工作,你將如何通過這個方法進步? –

+0

它可以使用存根進行單元測試。 –

+0

不幸的是,FrameworkX類是final的,所以這不起作用 –

相關問題