2016-09-20 3 views
0

PHPUnitで、サブドメインのSymfonyルートに基づいたURLを返す簡単なメソッドを作成しようとしています。私のテストでSymfony Routerコンポーネントに適切なアクセス権があるかどうかわからないので、それが落ちているのですが、現時点ではそれを通過させることはできません。PHPUnitテストでSymfony Routerコンポーネントを使用してURLを生成する

これは私が取得していますエラーです:

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; 
} 
です
関連する問題