2017-08-31 21 views
0

ためPHPUnitのテストでカスタム名前空間を作成し、私はトラブルカスタム名前空間を作成したのです:MediaWikiの拡張のためのPHPUnitテストではMediaWikiの拡張

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で名前空間をプログラムで作成するにはどうすればよいですか?

+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!"); 
    } 
} 
関連する問題