【问题标题】:Symfony CMF WebTestCase missing phpcr:managed node typeSymfony CMF WebTestCase 缺少 phpcr:托管节点类型
【发布时间】:2018-02-20 10:11:33
【问题描述】:

我正在尝试为集成在我们的 Web 应用程序中的简单博客编写一些 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 类有一个包含以下内容的加载方法:

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);
}

这就是失败的地方。运行测试时,我收到错误消息“Register phpcr:managed node type first.”。

你知道如何解决这个问题吗?

我知道我必须先初始化 PHPCR。这可以在加载夹具时完成吗?

编辑:我还尝试使用自定义初始化程序加载此数据。但我得到了同样的错误。

【问题讨论】:

    标签: php symfony phpunit symfony-cmf doctrine-phpcr


    【解决方案1】:

    听起来您缺少对命令 register-system-node-types 的调用,以设置您在测试中使用的存储库。该命令将注册类型。

    【讨论】:

    • 感谢您的反馈。我尝试在运行测试之前调用 init 命令,但它导致了一些其他错误。我使用 Liip FunctionalTestBundle 和 Sqlite 数据库进行测试。也许这与包如何处理 Sqlite 文件(制作文件的副本)有关。
    • cmf 沙箱是这样操作的:github.com/symfony-cmf/cmf-sandbox/blob/…
    【解决方案2】:

    找到了可能的解决方案。我在初始化程序中自己注册了 phpcr:managed 节点类型。 这是我的完整初始化程序类。

    <?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';
        }
    }
    

    【讨论】:

    • 虽然这可行,但必须这样做似乎是错误的。有一个命令可以做到这一点
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    • 2019-04-06
    • 1970-01-01
    • 2015-09-08
    • 2019-04-17
    • 1970-01-01
    相关资源
    最近更新 更多