1

我正在使用 PHPUnit 测试代码。我们如何测试该函数是否在循环内从同一类调用另一个函数?这是我的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]);
    }
4

1 回答 1

-1

您要问的是使用模拟对象完成的。模拟对象是您预期类的假版本,仅在您需要测试时调用该函数时才进行查看。

有很多 mocking 库,也可以直接用 PHPUnit 来做。这是取自PHPUnit 文档的示例:

<?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();
    }
}
?>
于 2015-04-20T07:51:32.367 回答