这个真的把我难住了。
我正在尝试在我的应用程序上运行功能测试,但遇到了 KNP Menu Bundle 的问题,而且我不完全确定我哪里出错了。
我有一些实体正在被 Doctrine Fixtures 加载,并且我知道它们在那里——测试套件的其他部分在找到它们并断言它们是我想要的那样时没有问题。
在我setUp()
的测试方法(扩展WebTestCase
)中,我创建了一个客户端并将实体管理器注入其中,如下所示:
/**
* Create Client and inject services
*/
$this->client = static::createClient();
$this->client->getContainer()->set( 'doctrine.orm.entity_manager', $this->em );
其他测试都没有使用该实体管理器和查找实体的问题。
我将菜单作为服务使用,定义如下:
the_site.menu_builder:
class: TheSite\SiteBundle\Menu\MenuBuilder
arguments: [ "@knp_menu.factory", "@doctrine.orm.entity_manager" ]
the_site.menu.breadcrumb:
class: Knp\Menu\MenuItem
factory_service: the_site.menu_builder
factory_method: breadcrumbMenu
arguments: [ "@request" ]
scope: request
tags:
- { name: knp_menu.menu, alias: breadcrumb }
它似乎窒息的代码是这样的:
public function breadcrumbMenu( Request $request )
{
// ......
/**
* @var $category NewsCategory
*/
$category = $this->em->getRepository( 'TheSiteSiteBundle:Category' )->findOneByCanonical( $request->get( 'category' ) );
$categories = [];
do
{
$categories[] = $category;
$category = $category->getParent();
} while( $category !== null );
// .....
}
我做了一些调查(包括一些非常复杂的 var_dump'ing ;)),它似乎无法找到由夹具设置的任何类别。如果它有帮助,实体被设置在一个原则交易中,但仍然 - 其他测试证明客户端之前设法找到这些实体很好!
$request->get( 'category' )
产生它应该做的事情,据我所知,这是实体管理器的问题。
如果需要更多代码,我很乐意分享。
编辑:我可能会收回我所说的话 - 现在它似乎没有在任何地方加载实体。也许在数据库中还有一些地方或其他地方!