如何对数据提取方法进行单元测试
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?
}
}
您可以遍历集合并断言每个项目都处于 'Complete' 状态。
但是你在这里做的事情叫做 integration test。
您不是在测试您的方法(单元),而是在测试框架的行为方式(从存储中获取数据)以及过滤方法的工作方式。
如果您想进行单元测试,请查看此 article。您应该为 FramewokX->getDataCollection()
方法创建一个存根。
如何使用第三方依赖项测试方法
如果 FrameworkX 是最终的,那么您可以声明一个接口:
interface iDataSource
{
public function getDataCollection($path);
}
和一个新的 class:
class DataSource implements iDataSource
{
public function getDataCollection($path)
{
//no need to test this method, it's just a wrapper
return FrameworkX->getDataCollection('sales/orders');
}
}
在你的 class 中创建 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
}
我创建了一个与框架交互的方法,提取具有已完成状态的订单项。
但是,我如何对我的方法进行单元测试以确保其行为正确...
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?
}
}
您可以遍历集合并断言每个项目都处于 'Complete' 状态。
但是你在这里做的事情叫做 integration test。
您不是在测试您的方法(单元),而是在测试框架的行为方式(从存储中获取数据)以及过滤方法的工作方式。
如果您想进行单元测试,请查看此 article。您应该为 FramewokX->getDataCollection()
方法创建一个存根。
如何使用第三方依赖项测试方法
如果 FrameworkX 是最终的,那么您可以声明一个接口:
interface iDataSource
{
public function getDataCollection($path);
}
和一个新的 class:
class DataSource implements iDataSource
{
public function getDataCollection($path)
{
//no need to test this method, it's just a wrapper
return FrameworkX->getDataCollection('sales/orders');
}
}
在你的 class 中创建 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
}