Php 如何对数据提取方法进行单元测试
我已经创建了一个与框架交互的方法,提取具有完成状态的订单项 但是,如何对我的方法进行单元测试以确保其正确运行Php 如何对数据提取方法进行单元测试,php,unit-testing,phpunit,Php,Unit Testing,Phpunit,我已经创建了一个与框架交互的方法,提取具有完成状态的订单项 但是,如何对我的方法进行单元测试以确保其正确运行 class A { public function extractData() { // extract data from framework $dataCollection = FrameworkX->getDataCollection('sales/orders'); $dataCollection->fi
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()方法创建存根
如何测试具有第三方依赖关系的方法
如果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中创建:
并更改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
}
这不是单元测试,而是集成测试。所以extractData方法不能进行单元测试?如果使用tdd方法,您将如何处理此问题?不幸的是,FrameworkX类是最终类,因此无法工作。这不是问题,您可以为其声明自己的包装器。@MartyWallace我已更新了我的答案。请看一看。
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
}