2012-07-29 11 views
9

Próbuję zaimplementować RSpec/Jasmine jak ramy BDD w Powershell (lub przynajmniej zbadać potencjalne problemy z ich tworzeniem).PowerShell - blok skryptu wykonywania w określonym zakresie

Obecnie mam problemy z wdrażaniem prostych funkcji przed/po. Biorąc

$ErrorActionPreference = "Stop" 

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

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

function after($sb) 
    { 
    & $sb 
    } 

describe 

wyjście jest 0, ale chciałbym go mieć 2. Czy istnieje jakiś sposób, aby osiągnąć to w PowerShell (krótka dokonywania $ aaaa globalny, przejeżdżające zakresów nadrzędnych w blokach skryptu do $ aaaa znaleziono , czyniąc $ aaaa "obiektem" i innymi brudnymi hackami :))

To, co chciałbym najbardziej, to sposób na wywołanie bloku skryptu w jakimś innym zakresie, ale nie mam pojęcia, czy w ogóle jest to możliwe . Znalazłem interesujący przykład na https://connect.microsoft.com/PowerShell/feedback/details/560504/scriptblock-gets-incorrect-parent-scope-in-module (patrz obejście), ale nie jestem pewien, jak to działa i czy pomaga mi w jakikolwiek sposób.

TIA

+0

Czy spojrzał na Pester: https://github.com/scottmuc/pester – manojlds

+0

Tak, to nie jest tak jak RSpec/Jasmine, prawdopodobnie ze względu na problemy opisane powyżej. Mam bardzo ograniczone doświadczenie z Pester, ale IMHO Pester to bardzo ograniczony framework, no after/before, brak zagnieżdżonych opisów, zepsutej implementacji matcherów itp. – mbergal

+1

Zastanów się nad wniesieniem wkładu :) – manojlds

Odpowiedz

8

Operator połączeń (&) zawsze wykorzystuje nowy zakres. Zamiast tego należy użyć źródła operator kropki (.):

$ErrorActionPreference = "Stop" 

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

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

function after($sb) 
    { 
    . $sb 
    } 

describe 

Uwaga wykorzystanie . function do wywołania funkcji w takim samym zakresie jak gdzie `$ aaaa jest zdefiniowana.

Powiązane problemy