在 phpunit test 中为 MediaWiki 扩展创建自定义命名空间
Create custom namespace in phpunit test for MediaWiki extension
在 MediaWiki 扩展的 phpunit 测试中,我在创建自定义命名空间时遇到问题:
class NameSpaceTestCase extends \MediaWikiTestCase {
public function testCustomNameSpace() {
$ns = 4000;
$this->setMwGlobals( [
"wgExtraNamespaces[$ns]" => 'custom_namespace'
] );
// global $wgExtraNamespaces;
// $wgExtraNamespaces[$ns] = 'custom_namespace';
$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!" );
}
}
命名空间存在的断言(在最后一行代码中)失败。
当我取消注释当前注释的行(并改为注释对 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!" );
}
}
在 MediaWiki 扩展的 phpunit 测试中,我在创建自定义命名空间时遇到问题:
class NameSpaceTestCase extends \MediaWikiTestCase {
public function testCustomNameSpace() {
$ns = 4000;
$this->setMwGlobals( [
"wgExtraNamespaces[$ns]" => 'custom_namespace'
] );
// global $wgExtraNamespaces;
// $wgExtraNamespaces[$ns] = 'custom_namespace';
$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!" );
}
}
命名空间存在的断言(在最后一行代码中)失败。
当我取消注释当前注释的行(并改为注释对 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!" );
}
}