2012-07-29 12 views
9

Estoy tratando de implementar RSpec/Jasmine como BDD framework en Powershell (o al menos investigar los posibles problemas al crear uno).PowerShell: ejecutar el bloque de secuencia de comandos en el ámbito específico

Actualmente estoy teniendo problemas para implementar funciones simples antes/después. Dada

$ErrorActionPreference = "Stop" 

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

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

function after($sb) 
    { 
    & $sb 
    } 

describe 

la salida es 0, pero me gustaría que fuera 2. ¿Hay alguna manera de lograrlo en Powershell (abreviatura de hacer $ AAAA mundial, atravesando los alcances de los padres en los bloques de script hasta que se encontró $ AAAA , lo que hace que $ aaaa sea un "objeto" y otros hackes sucios :))

Lo que idealmente me gustaría es una forma de invocar un bloque de script en algún otro ámbito, pero no tengo ni idea de si es posible en absoluto . Encontré un ejemplo interesante en https://connect.microsoft.com/PowerShell/feedback/details/560504/scriptblock-gets-incorrect-parent-scope-in-module (ver solución alternativa), pero no estoy seguro de cómo funciona y si me ayuda de alguna manera.

TIA

+0

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

+0

Sí, no es como RSpec/Jasmine, probablemente debido a los problemas descritos anteriormente. Tengo una experiencia muy limitada con Pester, pero en mi humilde opinión Pester es un marco muy limitado, sin after/before, sin descripciones anidadas, implementación de matcher roto, etc. – mbergal

+1

Considere contribuir luego :) – manojlds

Respuesta

8

El operador de llamada (&) siempre utiliza un nuevo ámbito. En su lugar, utilice la fuente operador punto (.):

$ErrorActionPreference = "Stop" 

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

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

function after($sb) 
    { 
    . $sb 
    } 

describe 

Nota el uso de . function para invocar la función en mismo alcance que el que se define `$ AAAA.

Cuestiones relacionadas