2012-11-27 3 views
1

WebTestCase 클래스로 기능 테스트를 수행 할 때 @Route 주석이 작동하지 않습니다.WebTestCase가 @Route 주석을 자동로드하지 않습니다.

내 컨트롤러는 다음과 같습니다

<?php 
namespace Foo\ShopBundle\Controller; 

use Foo\ShopBundle\Entity\Cart; 
use Foo\ShopBundle\Entity\ProductInterface; 

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template; 

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 

/** 
* @Route("cart") 
*/ 
class CartController extends Controller 
{ 
    const CART_ID = 'cart_id'; 

    /** 
    * @Route("/") 
    * @Template() 
    */ 
    public function indexAction() 
    { 
     return array('cart' => $this->getCart($this->getCurrentUserName(), $this->getCurrentSessionId())); 
    } 

    ... 

?> 

내 브라우저에서 컨트롤러를 호출하는 경우이 잘 작동합니다.

Doctrine\Common\Annotations\AnnotationException : [Semantical Error] The annotation "@Sensio\Bundle\FrameworkExtraBundle\Configuration\Route" in class Foo\ShopBundle\Controller\CartController does not exist, or could not be auto-loaded. 
#0 /Users/ernst/Source/php/cinergy/shop/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocParser.php(597): Doctrine\Common\Annotations\AnnotationException::semanticalError('The annotation ...') 
#1 /Users/ernst/Source/php/cinergy/shop/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocParser.php(533): Doctrine\Common\Annotations\DocParser->Annotation() 
#2 /Users/ernst/Source/php/cinergy/shop/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocParser.php(297): Doctrine\Common\Annotations\DocParser->Annotations() 
#3 /Users/ernst/Source/php/cinergy/shop/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationReader.php(151): Doctrine\Common\Annotations\DocParser->parse('/**? * @Route("...', 'class Foo\S...') 
#4 /Users/ernst/Source/php/cinergy/shop/vendor/doctrine/common/lib/Doctrine/Common/Annotations/FileCacheReader.php(90): Doctrine\Common\Annotations\AnnotationReader->getClassAnnotations(Object(ReflectionClass)) 
#5 /Users/ernst/Source/php/cinergy/shop/vendor/jms/di-extra-bundle/JMS/DiExtraBundle/Metadata/Driver/AnnotationDriver.php(65): Doctrine\Common\Annotations\FileCacheReader->getClassAnnotations(Object(ReflectionClass)) 
#6 /Users/ernst/Source/php/cinergy/shop/vendor/jms/metadata/src/Metadata/Driver/LazyLoadingDriver.php(20): JMS\DiExtraBundle\Metadata\Driver\AnnotationDriver->loadMetadataForClass(Object(ReflectionClass)) 
#7 /Users/ernst/Source/php/cinergy/shop/vendor/jms/metadata/src/Metadata/MetadataFactory.php(77): Metadata\Driver\LazyLoadingDriver->loadMetadataForClass(Object(ReflectionClass)) 
#8 /Users/ernst/Source/php/cinergy/shop/vendor/jms/di-extra-bundle/JMS/DiExtraBundle/HttpKernel/ControllerResolver.php(84): Metadata\MetadataFactory->getMetadataForClass('Foo\ShopBun...') 
#9 /Users/ernst/Source/php/cinergy/shop/vendor/jms/di-extra-bundle/JMS/DiExtraBundle/HttpKernel/ControllerInjectorsWarmer.php(31): JMS\DiExtraBundle\HttpKernel\ControllerResolver->createInjector('Foo\ShopBun...') 
#10 /Users/ernst/Source/php/cinergy/shop/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/CacheWarmer/CacheWarmerAggregate.php(47): JMS\DiExtraBundle\HttpKernel\ControllerInjectorsWarmer->warmUp('/Users/ernst/So...') 
#11 /Users/ernst/Source/php/cinergy/shop/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/Kernel.php(595): Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerAggregate->warmUp('/Users/ernst/So...') 
#12 /Users/ernst/Source/php/cinergy/shop/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/Kernel.php(133): Symfony\Component\HttpKernel\Kernel->initializeContainer() 
#13 /Users/ernst/Source/php/cinergy/shop/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Test/WebTestCase.php(43): Symfony\Component\HttpKernel\Kernel->boot() 
#14 /Users/ernst/Source/php/cinergy/shop/src/Foo/ShopBundle/Tests/Controller/CartControllerFunctionalTest.php(19): Symfony\Bundle\FrameworkBundle\Test\WebTestCase::createClient() 
#15 [internal function]: Foo\ShopBundle\Tests\Controller\CartControllerFunctionalTest->testIndexAction() 
#16 /Applications/MAMP/bin/php/php5.3.14/lib/php/PHPUnit/Framework/TestCase.php(967): ReflectionMethod->invokeArgs(Object(Foo\ShopBundle\Tests\Controller\CartControllerFunctionalTest), Array) 
#17 /Applications/MAMP/bin/php/php5.3.14/lib/php/PHPUnit/Framework/TestCase.php(825): PHPUnit_Framework_TestCase->runTest() 
#18 /Applications/MAMP/bin/php/php5.3.14/lib/php/PHPUnit/Framework/TestResult.php(649): PHPUnit_Framework_TestCase->runBare() 
#19 /Applications/MAMP/bin/php/php5.3.14/lib/php/PHPUnit/Framework/TestCase.php(770): PHPUnit_Framework_TestResult->run(Object(Foo\ShopBundle\Tests\Controller\CartControllerFunctionalTest)) 
#20 /Applications/MAMP/bin/php/php5.3.14/lib/php/PHPUnit/Framework/TestSuite.php(776): PHPUnit_Framework_TestCase->run(Object(PHPUnit_Framework_TestResult)) 
#21 /Applications/MAMP/bin/php/php5.3.14/lib/php/PHPUnit/Framework/TestSuite.php(746): PHPUnit_Framework_TestSuite->runTest(Object(Foo\ShopBundle\Tests\Controller\CartControllerFunctionalTest), Object(PHPUnit_Framework_TestResult)) 
#22 /Applications/MAMP/bin/php/php5.3.14/lib/php/PHPUnit/Framework/TestSuite.php(706): PHPUnit_Framework_TestSuite->run(Object(PHPUnit_Framework_TestResult), false, Array, Array, false) 
#23 /Applications/MAMP/bin/php/php5.3.14/lib/php/PHPUnit/TextUI/TestRunner.php(325): PHPUnit_Framework_TestSuite->run(Object(PHPUnit_Framework_TestResult), false, Array, Array, false) 
#24 /Applications/MAMP/bin/php/php5.3.14/lib/php/PHPUnit/TextUI/Command.php(177): PHPUnit_TextUI_TestRunner->doRun(Object(PHPUnit_Framework_TestSuite), Array) 
#25 /private/var/folders/kc/ylyxk45170z_g5h6c2_vr0_00000gp/T/ide-phpunit.php(102): PHPUnit_TextUI_Command->run(Array, true) 
#26 /private/var/folders/kc/ylyxk45170z_g5h6c2_vr0_00000gp/T/ide-phpunit.php(442): IDE_PHPUnit_TextUI_Command::main() 
#27 {main} 

모든 아이디어를 어떻게이 문제를 해결하기 위해 :하지만 WebTestCase에서 동일한 URL을 호출하면 다음 excetpion를 얻을?

답변

2

이 질문은 내가 뭔가 추가 할 아주 오래된하지만 (그나마 $를 정의하는 vendorDir을 잊지)

use Doctrine\Common\Annotations\AnnotationRegistry; 
.... 
public function setUp() 
{ 
    /** To make annotations work here */ 
    AnnotationRegistry::registerAutoloadNamespaces(array('Sensio\\Bundle\\FrameworkExtraBundle' => $vendorDir . '/sensio/framework-extra-bundle/')); 
.... 
+0

완벽하게 작동합니다. 감사. – BetaRide

+0

그러나 이것이 왜 필요한지 궁금합니다. WebTestCase는 전체 AppKernel을 부트 스 랩합니다. 응용 프로그램이 브라우저에서 제대로 작동하기 때문에 여기서 차이점이 없기를 기대합니다. – BetaRide

+0

동일한 문제가 있었는데 주석이 브라우저뿐만 아니라 test env에서도 작동하지 않는 이유를 모르겠습니다. 그래서이 해결 방법을 발견했습니다. – Ziumin

2

셋업() 메소드이 추가보십시오 :

당신이 있는지 확인 이동하세요 테스트 중에 항상 phpunit.xml (.dist) 파일을 가리키고 있습니다.

의미 :

# OK 
phpunit -c app/ src/MyNamespace/Bundlee/MyBundle/Controller/MyControllerTest.php 

가 작동합니다.

그러나 예상대로 심포니가 부팅되지 않을 수 있기 때문에 테스트 러너를 중단합니다 명령에 -c app을 삭제하십시오 자동 로딩이 정상적으로 초기화 할 수 없습니다 후자의 경우

# ERROR 
phpunit src/MyNamespace/Bundlee/MyBundle/Controller/MyControllerTest.php 

그래서 교리 주석이 수 없습니다 제대로 등록되었습니다.

위에서 언급 한 setUp 메소드의 "조정"은 더 이상 필요하지 않습니다!

1

phpunit.xml.dist 파일을 확인하십시오. 부트 스트랩 매개 변수는 ./autoload.php 파일을 가리켜 야합니다 (파일이 Symfony 앱 디렉토리에 있다고 가정). 부트 스트랩 값이 ../vendor/autoload.php 인 경우 'loadClass'를 등록하지 않습니다.

0

동일한 문제가 발생했습니다.

<phpunit backupGlobals="false" 
     ... 
     bootstrap="vendor/autoload.php"> 

나를 위해 문제를 해결 bootstrapapp/bootstrap.php.cache의 값을 변경 : 밝혀졌다 나는 내 phpunit.xml에 다음을했다. 주석 로더가 올바르게 등록됩니다.

https://github.com/symfony/symfony-standard/blob/2.8/app/phpunit.xml.dist#L8을 살펴보면 기본 Symfony 응용 프로그램에서이 파일을 PHPUnit 부트 스트랩으로 사용한다는 것을 알 수 있습니다.

내 phpunit.xml은 app 디렉토리가 아닌 내 프로젝트의 루트에 있습니다. phpunit.xml 파일이 app 디렉토리에 있으면 간단하게 을 사용할 수 있습니다.