我创建了一个与框架交互的方法,提取已完成状态的订单项。
但是,我如何对我的方法进行单元测试以确保其正常运行...
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
}