2016-09-20 1 views
0

Я пытаюсь написать тест в PHPUnit для простого метода, который возвращает URL-адрес на основе маршрута Symfony для субдомена. Я не уверен, что мой тест имеет надлежащий доступ к компоненту Symfony Router, и именно поэтому он падает, но я не могу, похоже, заставить его пройти в данный момент.Создание URL-адреса с компонентом Symfony Router в PHPUnit-тесте

Это ошибка я получаю:

There was 1 error:

1) CRMPiccoBundle\Tests\Services\MailerHelperTest::testReturnsBillingURL with data set "crmpicco.co.uk" (CRMPiccoBundle\Entity\Course Object (...), ' https://www.crmpicco.co.uk/en/admin/billing ') TypeError: Return value of CRMPiccoBundle\Services\MailerHelper::getBillingUrlForSubdomain() must be of the type string, null returned

Это мой тест и поставщик данных:

/** 
* @dataProvider dataProvider 
*/ 
public function testReturnsBillingURL(Course $course, string $expectedUrl) 
{ 
    $mailerHelper = new MailerHelper($this->getRouterMock()); 
    $this->assertEquals($expectedUrl, $mailerHelper->getBillingUrlForSubdomain($course, true)); 
} 

public function dataProvider() 
{ 
    return [ 
     'crmpicco.co.uk' => [ 
      'site' => (new Course()) 
       ->setSubdomain('crmpicco'), 
      'expectedUrl' => 'https://www.crmpicco.co.uk/en/admin/billing', 
     ], 
    ]; 
} 

Это мой метод getRouterMock:

/** 
* @return \Symfony\Bundle\FrameworkBundle\Routing\Router 
*/ 
protected function getRouterMock() 
{ 
    return $this->getMockBuilder('\Symfony\Bundle\FrameworkBundle\Routing\Router') 
     ->disableOriginalConstructor() 
     ->setMethods(['generate', 'supports', 'exists']) 
     ->getMockForAbstractClass(); 
} 

Это метод Я тестирую:

/** 
* @param Course $course 
* @param bool $absoluteUrl 
* 
* @return string 
*/ 
public function getBillingUrlForSubdomain(Course $course, bool $absoluteUrl = true) : string 
{ 
    return $this->router->generate('crmpiccobundle_portal_billing', [ 
     'subdomain' => $site->getSubdomain(), 
    ], $absoluteUrl); 
} 

ответ

1

Но вы не получаете надлежащего доступа к маршрутизатору Symfony, вы издеваетесь над ним. И в этом макете вы не определяете, что возвращать по вызову метода generate(), поэтому неудивительно, что он возвращает null.

Ваш недостающий кусок

/** 
* @return \Symfony\Bundle\FrameworkBundle\Routing\Router 
*/ 
protected function getRouterMock() 
{ 
    $mock = $this->getMockBuilder('\Symfony\Bundle\FrameworkBundle\Routing\Router') 
       ->disableOriginalConstructor() 
       ->setMethods(['generate', 'supports', 'exists']) 
       ->getMockForAbstractClass(); 

    $args = ['crmpiccobundle_portal_billing', [ 
     'subdomain' => "crmpicco", 
    ], true]; 

    $mock->expects($this->any()) 
     ->method('generate') 
     ->withArgs($args) 
     ->will($this->returnValue('https://www.crmpicco.co.uk/en/admin/billing')); 

    return $mock; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^