在链接到MediaWiki扩展
问题描述:
在PHPUnit测试一个链接到MediaWiki扩展,我无法创建一个自定义命名空间PHPUnit的测试创建自定义命名空间失败。在链接到MediaWiki扩展
当我取消对当前注释行的注释(并且改为将其注释为setMwGlobals
),它仍然失败。
如何以编程方式在MediaWiki中创建名称空间?
答
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!");
}
}
添加'[...]'到变量名的末尾没有任何用处。您需要'$ this-> mergeMwGlobalArrayValue('wgExtraNamespaces',[$ ns =>'custom_namespace'])' – Tgr
可能命名空间在测试运行时已被缓存。你可以调用'MWNamespace :: getCanonicalNamespaces(true)'来重建缓存。 – Tgr
谢谢@Tgr,这就是解决方案:使用'mergeMwGlobalArrayValue'后跟'MWNamespace :: getCanonicalNamespaces(true)'。你想添加这个答案吗?然后我可以将其标记为已解决。 – bovender