使用 PHPunit 测试代码时遇到问题

Having trouble with testing code using PHPunit

我正在使用 PHPUnit.How 测试代码,我们是否测试该函数是否在循环内从同一个 class 调用另一个函数? 这是我的 dashboardmanager.php

public function getZoneOrderValue($businessUnitId, $fromDate, $toDate)
    {
        $repository = $this->getRepository();
        $query = $repository->getZoneCount($businessUnitId, $fromDate, $toDate);
        $results = $this->type->search($query)->getAggregations('by_zone');

        $results = $results['by_zone']['buckets'];
        $i = 0;
        foreach ($results as $result) {
            $zoneOrderValue[$i] = array();
            $zoneValue = $result['order_value']['value'];
            $zoneId = $result['key'];
            $zoneName = $this->getZoneName($zoneId);
            array_push($zoneOrderValue[$i], $zoneName, $zoneValue);
            $i++;
        }

        return $zoneOrderValue;
    }

public function getZoneName($zoneId)
    {
        $repository = $this->getRepository();
        $query = $repository->getZoneName($zoneId);
        $zone = $this->type->search($query)->getResults();
        $zone = $zone[0]->getFields();
        $zoneName = $zone['zone'][0];

        return $zoneName;
    }

这是我的测试文件。我在 test_getZoneOrderValue() 中遇到问题。这是我的 dashboardmanagertest.php

protected $dash;
    protected $ob;
    protected $container;
    protected $prophet;
    protected $elasticManager;
    protected $elasticIndexManager;
    protected $repoManager;
    protected $resultSet;
    protected $type;

    public function setup()
    {
        $this->prophet = new \Prophecy\Prophet();
        $this->ob = $this->prophet->prophesize('Doctrine\Common\Persistence\ObjectManager');
        $this->container = $this->prophet->prophesize('Symfony\Component\DependencyInjection\Container');
        $this->elasticManager = $this->prophet->prophesize('FOS\ElasticaBundle\Doctrine\RepositoryManager');
        $this->elasticIndexManager = $this->prophet->prophesize('Elastica\Type');
        $this->repoManager = $this->prophet->prophesize('UDN\Bundle\DataTransferBundle\Entity\SearchRepository\OrderReportRepository');
        $this->resultSet = $this->prophet->prophesize('Elastica\ResultSet');
        $this->type = $this->createIndex();
        $this->type = $this->prophet->prophesize('Elastica\Type');

        $type = $this->createIndex();


        $index = $this->createIndex();

        $this->dash = new DashBoardManager($this->ob->reveal(), $this->container->reveal(), $this->type->reveal());



    }



    public function test_getZoneOrderValue()
    {
        $queryResult = array('by_zone' => array('buckets' => array(array('key_as_string' => '','key' => '','doc_count' => '','order_value' => array('value' => '')))));

        $this->container->get('fos_elastica.manager')->willReturn($this->elasticManager->reveal());
        $this->elasticManager->getRepository('UDNDataTransferBundle:OrderReport')->willReturn($this->repoManager->reveal());

        $this->repoManager->getZoneCount(2, '2015-02-22', '2015-02-22')->willReturn([]);

        $this->container->get('fos_elastica.index.rosia_test.orders_test')->willReturn($this->type->reveal());

        $this->type->search([])->willReturn($this->resultSet->reveal());
        $this->resultSet->getAggregations('by_zone')->willReturn($queryResult);

        $this
        $this->repoManager->getZoneName(2)->willReturn([]);

        $result = $this->dash->getZoneOrderValue(2, '2015-02-22', '2015-02-22');

        //$this->assertCount(2, $result[0]);
    }

你问的是用模拟对象完成的。模拟对象是您预期 class 的伪造版本,它仅在函数被调用时看起来像您需要测试的那样。

mocking库有很多,也可以直接用PHPUnit搞定。这是取自 PHPUnit docs:

的示例
<?php
class SubjectTest extends PHPUnit_Framework_TestCase
{
    public function testObserversAreUpdated()
    {
        // Create a mock for the Observer class,
        // only mock the update() method.
        $observer = $this->getMockBuilder('Observer')
                         ->setMethods(array('update'))
                         ->getMock();

        // Set up the expectation for the update() method
        // to be called only once and with the string 'something'
        // as its parameter.
        $observer->expects($this->once())
                 ->method('update')
                 ->with($this->equalTo('something'));

        // Create a Subject object and attach the mocked
        // Observer object to it.
        $subject = new Subject('My subject');
        $subject->attach($observer);

        // Call the doSomething() method on the $subject object
        // which we expect to call the mocked Observer object's
        // update() method with the string 'something'.
        $subject->doSomething();
    }
}
?>