Я пытаюсь написать несколько WebTestCases для простого блога, интегрированного в наше веб-приложение.
Один из тестовых случаев выглядит следующим образом:
public function testNewSubmitAction()
{
//load necessary data & login as admin
$fixtureRepo = $this->loadFixtures([LoadUserData::class])->getReferenceRepository();
$this->loadFixtures([LoadBlogData::class], null, 'doctrine_phpcr');
$this->loginAs($customer = $fixtureRepo->getReference(LoadUserData::ADMIN_ACCOUNT), $this->getContainer()->getParameter('firewall.name'));
$client = static::makeClient();
$crawler = $client->request("GET", "/content/blog/new");
$form = $crawler->selectButton('Erstellen')->form();
$client->submit($form, [
'blog[title]' => 'Testblog',
]);
$this->assertTrue($client->getResponse()->isRedirect());
}
Класс LoadBlogData имеет метод load со следующим содержимым:
public function load(ObjectManager $manager)
{
parent::init($manager);
NodeHelper::createPath($this->session, '/cms/routes/blog/de');
NodeHelper::createPath($this->session, '/cms/routes/blog/fr');
NodeHelper::createPath($this->session, '/cms/routes/blog/it');
NodeHelper::createPath($this->session, '/cms/routes/categories/de');
NodeHelper::createPath($this->session, '/cms/routes/categories/fr');
NodeHelper::createPath($this->session, '/cms/routes/categories/it');
NodeHelper::createPath($this->session, '/cms/pages/blog');
NodeHelper::createPath($this->session, '/cms/content/blog');
NodeHelper::createPath($this->session, '/cms/categories');
$this->createBlog($manager);
$manager->flush();
}
Метод createBlog должен создать запись в блоге.
private function createBlog(ObjectManager $manager)
{
$blog = new Blog();
$blog->setTitle('Test');
$blog->setName('test');
$blog->setCreatedAt(new \DateTime);
$blog->setUpdatedAt(new \DateTime);
$blog->setCreatedBy('Tester');
$blog->setParentDocument($manager->find(null, '/cms/pages/blog'));
$manager->persist($blog);
}
И вот где это не удается. При запуске теста я получаю сообщение об ошибке «Сначала зарегистрируйте phpcr: тип управляемого узла».
У вас есть идея, как это исправить?
Я знаю, что сначала мне нужно инициализировать PHPCR. Можно ли это сделать при загрузке приборов?
Изменить: я также попытался загрузить эти данные с помощью пользовательского инициализатора. Но я получаю ту же ошибку.
Похоже, вы пропустили вызов команды register-system-node-types
настроить репозиторий, который вы используете в тесте. Эта команда будет регистрировать тип.
Нашел возможное решение. Я сам регистрирую тип управляемого узла phpcr: в своем инициализаторе.
Вот мой полный класс инициализатора.
<?php
namespace ContentBundle\Initializer;use Doctrine\Bundle\PHPCRBundle\Initializer\InitializerInterface;
use Doctrine\Bundle\PHPCRBundle\ManagerRegistry;
use PHPCR\Util\NodeHelper;
use Doctrine\ODM\PHPCR\Translation\Translation;
class BlogInitializer implements InitializerInterface
{
private $basePath;
private $phpcrNamespace = 'phpcr';
private $phpcrNamespaceUri = 'http://www.doctrine-project.org/projects/phpcr_odm';
private $localeNamespace = Translation::LOCALE_NAMESPACE;
private $localeNamespaceUri = Translation::LOCALE_NAMESPACE_URI;
/**
* BlogInitializer constructor.
* @param string $basePath
*/
public function __construct($basePath = '/cms/pages/blog')
{
$this->basePath = $basePath;
}
/**
* @param ManagerRegistry $registry
*/
public function init(ManagerRegistry $registry)
{
$dm = $registry->getManager();
if ($dm->find(null, $this->basePath)) {
return;
}
// register phpcr:managed node type
$cnd = <<<CND
// register phpcr_locale namespace
<$this->localeNamespace='$this->localeNamespaceUri'>
// register phpcr namespace
<$this->phpcrNamespace='$this->phpcrNamespaceUri'>
[phpcr:managed]
mixin
- phpcr:class (STRING)
- phpcr:classparents (STRING) multiple
CND
;
$session = $registry->getConnection();
$ntm = $session->getWorkspace()->getNodeTypeManager();
$ntm->registerNodeTypesCnd($cnd, true);
// create basic paths in repository
NodeHelper::createPath($session, '/cms/routes/blog/de');
NodeHelper::createPath($session, '/cms/routes/blog/fr');
NodeHelper::createPath($session, '/cms/routes/blog/it');
NodeHelper::createPath($session, '/cms/routes/categories/de');
NodeHelper::createPath($session, '/cms/routes/categories/fr');
NodeHelper::createPath($session, '/cms/routes/categories/it');
NodeHelper::createPath($session, '/cms/pages/blog');
NodeHelper::createPath($session, '/cms/content/blog');
NodeHelper::createPath($session, '/cms/categories');
$session->save();
}
/**
* @return string
*/
public function getName()
{
return 'Blog Initializer';
}
}