Symfony在测试服务中忽略模拟

时间:2018-11-09 14:35:21

标签: unit-testing symfony service mocking symfony-2.8

我正在尝试使用phpunit测试服务。当我在StatServiceTest中模拟一个函数时,我的服务将忽略我所做的模拟。 用一个例子会更清楚: 我的service.yml

    my_service:
    class: '%my_service.class%'
    parent: parent_service
    arguments:
        - '@service.repository.commutation'
        - '@service.repository.stat'
        - '@service.repository.switchboard'
        - '%sunrise_host%'

我的服务:StatService.php

class StatService extends AbstractService
{
    protected $commutationRepository;
    protected $statRepository;
    protected $switchboardRepository;
    protected $sunrise_host;

    public function __construct(CommutationRepository $commutationRepository, StatRepository $statRepository, SwitchboardRepository $switchboardRepository, $sunrise_host)
    {
        $this->commutationRepository = $commutationRepository;
        $this->statRepository = $statRepository;
        $this->switchboardRepository = $switchboardRepository;
        $this->sunrise_host = $sunrise_host;
   }


   public function getNightsWithSunService($id, $start, $end)
   {
       $switchboard = $this->switchboardRepository->getById($id);
       $parameters = array(
        'begin' => (int) $start,
        'end' => (int) $end,
        'lat' => (float) $switchboard->getElement()->getCoordinate()->getLat(),
        'lng' => (float) $switchboard->getElement()->getCoordinate()->getLng(),
        'timezone' => $switchboard->getElement()->getCoordinate()->getTimezone(),
    );
    $buzz = new Buzz();
    $result = $buzz->post(
        $this->sunrise_host.'/nights',
        array(
            'Content-Type' => 'application/json',
        ),
        json_encode($parameters)
    );

    return json_decode($result->getContent(), true);
    }
}

最后是我的StatServiceTest.php

class StatServiceTest extends WebTestCase
{


    public function testGetNightsWithSunService()
    {
        $dic = $this->_client->getKernel()->getContainer();
        $sunriseHost = $dic->getParameter('sunrise_host');
        $id = 426;
        $start = 1538400421;
        $end = 1538569621;
        $mapNights = $this->getNights();
        $mockStatService = $this->getMockBuilder("StatService")
           ->disableOriginalConstructor()
           ->getMock();
        $mockStatService
          ->expects($this->any())
          ->method('getNightsWithSunService')
          ->withConsecutive(array($id, $start, $end))
          ->willReturnOnConsecutiveCalls($mapNights)
        ;
       $statService = new StatService($mockCommutationRepository, 
       $mockStatRepository, $mockSwitchboardRepository, $sunriseHost);

    $result = $statService->getNightsWithSunService($id, $start, $end);

    $nights = array(
        array(
            'start' => 1538414415,
            'end' => 1538458643,
        ),
        array(
            'start' => 1538500702,
            'end' => 1538545117,
        ),
    );
         $this->assertTrue($this->arrays_are_similar($nights, $result));
    }


    public function getNights()
    {
       $nights = array(
           array(
              'start' => 1538414415,
              'end' => 1538458643,
           ),
           array(
              'start' => 1538500702,
              'end' => 1538545117,
           ),
       );

      return $nights;
   }

   public function arrays_are_similar($a, $b)
   {
       // we know that the indexes, but maybe not values, match.
       // compare the values between the two arrays
       foreach ($a as $k => $v) {
          if ($v !== $b[$k]) {
            return false;
          }
       }

       // we have identical indexes, and no unequal values
       return true;
   }
}

错误是:

testGetNightsWithSunService
Buzz\Exception\RequestException: 
file_get_contents(http://localhost:4244/nights): failed to open 
stream: Connection refused

我实例化了我的服务,并向其注入了我嘲笑的存储库,我只是放入了与问题有关的代码部分。 我做错了什么?请提供任何建议

1 个答案:

答案 0 :(得分:0)

我建立的解决方案是提供另一项服务=> toolsService,并为buzz部分提供函数回调,然后我们可以注入该服务,并且将更易于模拟。 希望对您有帮助