2012-07-29 15 views
9

PowershellでBDDフレームワークのようなRSpec/Jasmineを実装しようとしています。PowerShell - 特定のスコープでスクリプトブロックを実行する

現在、私は単純な前後機能を実装することに問題があります。

$ErrorActionPreference = "Stop" 

function describe() 
    { 
    $aaaa = 0; 
    before { $aaaa = 2; }; 
    after { $aaaa; } 
    } 

function before([scriptblock]$sb) 
    { 
    & $sb 
    } 

function after($sb) 
    { 
    & $sb 
    } 

describe 

与えられた出力は0ですが、私はそれが2になりたいの$ AAAAが発見されるまで、スクリプトブロックで親スコープを横断$のAAAAがグローバル作るの短いPowerShellでそれを達成する方法は(、あります$ aaaaを "オブジェクト"やその他の汚れたハックにする:))

私が理想的に思うのは、他のスコープでスクリプトブロックを呼び出す方法ですが、 。私はhttps://connect.microsoft.com/PowerShell/feedback/details/560504/scriptblock-gets-incorrect-parent-scope-in-moduleに面白い例を見つけました(回避策を見てください)。

TIA

+0

Pester:https://github.com/scottmuc/pester – manojlds

+0

はい、おそらく上記の問題のためにRSpec/Jasmineとよく似ていません。私はPesterで非常に限られた経験を持っていますが、IMHO Pesterは非常に限定されたフレームワークであり、後/後、ネストされた記述、壊れた正規表現の実装などはありません – mbergal

+1

寄付を検討してください:) – manojlds

答えて

8

は、呼び出し演算子(&)は、常に新しいスコープを使用しています。代わりに、ドットソースを使用演算子(。):

$ErrorActionPreference = "Stop" 

function describe() 
    { 
    $aaaa = 0; 
    . before { $aaaa = 2; }; 
    . after { $aaaa; } 
    } 

function before([scriptblock]$sb) 
    { 
    . $sb 
    } 

function after($sb) 
    { 
    . $sb 
    } 

describe 

注 `$のAAAAが定義されている場合と同じ範囲内の関数を呼び出すため. functionの使用。

関連する問題