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
 }