2017-08-31 95 views
0

在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

回答

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