【问题标题】:Create custom namespace in phpunit test for MediaWiki extension在 phpunit 测试中为 MediaWiki 扩展创建自定义命名空间
【发布时间】:2017-08-31 06:49:47
【问题描述】:

在 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 中创建命名空间?

【问题讨论】:

  • [...] 添加到变量名的末尾没有任何用处。你会想要$this->mergeMwGlobalArrayValue( 'wgExtraNamespaces', [ $ns => 'custom_namespace' ] )
  • 可能在测试运行时命名空间已被缓存。你可以调用MWNamespace::getCanonicalNamespaces( true )重建缓存。
  • 感谢@Tgr,这就是解决方案:使用mergeMwGlobalArrayValue,后跟MWNamespace::getCanonicalNamespaces( true )。您想将此添加为答案吗?然后我可以将其标记为已解决。
  • 虽然命名空间创建得很好,但我现在面临$this->insertPage( 'page in custom namespace', 'page content', $ns ); 没有创建有效页面的问题:当我执行print_r ( $page, true ) 时,我得到[mPrefixedText:protected] => Special:Badtitle/NS4000:In custom namespace 并且单元测试失败.扩展代码适用于生产环境中的命名空间,因此它必须是单元测试所固有的。
  • 更多缓存,可能吗?试试$wgContLang->resetNamespaces()

标签: namespaces phpunit mediawiki-extensions


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2016-01-24
    • 2021-10-29
    • 2018-07-29
    • 2015-08-20
    • 2011-09-27
    • 2012-09-02
    • 2015-10-31
    • 2018-09-17
    • 2012-08-20
    相关资源
    最近更新 更多