如何对数据提取方法进行单元测试

时间:2015-06-14 20:05:17

标签: php unit-testing phpunit

我创建了一个与框架交互的方法,提取已完成状态的订单项。

但是,我如何对我的方法进行单元测试以确保其正常运行...

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?
    }

}

1 个答案:

答案 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
 }