在链接到MediaWiki扩展

在链接到MediaWiki扩展

问题描述:

在PHPUnit测试一个链接到MediaWiki扩展,我无法创建一个自定义命名空间PHPUnit的测试创建自定义命名空间失败。在链接到MediaWiki扩展

当我取消对当前注释行的注释(并且改为将其注释为setMwGlobals),它仍然失败。

如何以编程方式在MediaWiki中创建名称空间?

+0

添加'[...]'到变量名的末尾没有任何用处。您需要'$ this-> mergeMwGlobalArrayValue('wgExtraNamespaces',[$ ns =>'custom_namespace'])' – Tgr

+0

可能命名空间在测试运行时已被缓存。你可以调用'MWNamespace :: getCanonicalNamespaces(true)'来重建缓存。 – Tgr

+0

谢谢@Tgr,这就是解决方案:使用'mergeMwGlobalArrayValue'后跟'MWNamespace :: getCanonicalNamespaces(true)'。你想添加这个答案吗?然后我可以将其标记为已解决。 – bovender

setMwGlobals对于更改全局变量的部分并不是很有用;您可以使用mergeMwGlobalArrayValue代替,或使用stashMwGlobals使测试自动恢复旧值,然后手动更改。另外,您必须确保旧值不会存储在任何位置 - 命名空间在请求初始化生命周期的早期被查找,并且它们包含各种不便宜的事情(如运行获取动态定义的命名空间的钩子以及获取翻译)被缓存。不幸的是,没有任何方法可以检查缺少尝试和查看调用树并查看价值来自哪里。具体来说(链接到MediaWiki慢慢走向依赖注入基础架构,测试必须在应用程序的状态更多的控制移动,但还没有应用。)

,你可以这样做

class NameSpaceTestCase extends \MediaWikiTestCase { 
    public function testCustomNameSpace() { 
    global $wgContLang; 
    $ns = 4000; 
    $this->mergeMwGlobalArrayValue('wgExtraNamespaces', [ 
     $ns => 'custom_namespace', 
    ]); 
    MWNamespace::getCanonicalNamespaces(true); // break namespace cache 
    $wgContLang->resetNamespaces(); // break namespace localization cache 
    $this->insertPage('in custom namespace', 'This is a page in a custom namespace', $ns); 
    $this->assertTrue(MWNamespace::exists($ns), "The name space with id $ns should exist!"); 
    } 
}