2012-07-29 60 views
9

我試圖在Powershell中實現RSpec/Jasmine像BDD框架(或者至少研究製作一個的潛在問題)。PowerShell - 在特定範圍內執行腳本塊

目前我在實現簡單的功能之前/之後有問題。鑑於

$ErrorActionPreference = "Stop" 

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

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

function after($sb) 
    { 
    & $sb 
    } 

describe 

輸出爲0,但我想它是2有沒有什麼辦法來實現它在PowerShell中(短腳本塊做$ AAAA全球,遍歷父作用域直到$ AAAA發現,使$ 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 2012-07-29 07:48:39

+0

是的,它不像RSpec/Jasmine,可能是因爲上述問題。我對Pester的經驗非常有限,但恕我直言Pester是一個非常有限的框架,沒有之前/之前,沒有嵌套描述,破碎匹配器實現等。 – mbergal 2012-07-29 07:51:41

+1

考慮貢獻然後:) – manojlds 2012-07-29 07:52:52

回答

8

調用運算符(&)總是使用一個新的範圍。相反,使用點源運算符(。):

$ErrorActionPreference = "Stop" 

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

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

function after($sb) 
    { 
    . $sb 
    } 

describe 

注意使用. function調用在相同的範圍內,其中`$ AAAA定義的功能。