![](/img/trans.png)
[英]How to write a PHP unit test for a method that uses live database data?
[英]How to unit test a data extraction method
我創建了一種與框架交互的方法,提取狀態為已完成的訂單商品。
但是,如何對我的方法進行單元測試以確保其正確運行...
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?
}
}
您可以遍歷集合並斷言每個項目都處於“已完成”狀態。
但是,您在這里所做的稱為集成測試 。
您不是要測試方法(單元),而是要測試框架的行為(從存儲中獲取數據)以及過濾器方法的工作方式。
如果您想進行單元測試,請參閱本文 。 您應該為FramewokX->getDataCollection()
方法創建一個Stub。
如何使用第三方依賴項測試方法
如果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中創建一個構造函數 :
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
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.