2012-07-29 13 views
9

Powershell'de RSpec/Jasmine BDD framework'ü uygulamaya çalışıyorum (veya en azından bir tane oluştururken olası sorunları araştırın).PowerShell - belirli bir kapsamda komut dosyası yürütme komutunu çalıştırın

Şu anda basit önce/sonra işlevselliği uygulamakta sorunlar yaşıyorum. Verilen

$ErrorActionPreference = "Stop" 

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

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

function after($sb) 
    { 
    & $sb 
    } 

describe 

çıkış 0'dır, ama 2. olmak istiyorum $ aaaa bulunursa kadar komut dosyası bloklar halinde ana kapsamları, $ aaaa küresel hale geçme kısa PowerShell bunu başarmak için herhangi bir yolu (var mı $ aaaa bir "object" ve diğer kirli hack yapma :))

İdeal olarak ne isterim ki başka bir alanda bir komut dosyası bloğu çağırmak için bir yoldur, ancak bunun mümkün olup olmadığına dair bir fikrim yok. . https://connect.microsoft.com/PowerShell/feedback/details/560504/scriptblock-gets-incorrect-parent-scope-in-module'da ilginç bir örnek buldum (bkz. Geçici çözüm), ancak nasıl çalıştığından ve herhangi bir şekilde bana yardımcı olup olmadığından emin değilim.

TIA

+0

Pester'e baktınız: https://github.com/scottmuc/pester – manojlds

+0

Evet, muhtemelen yukarıda açıklanan sorunlardan dolayı RSpec/Jasmine gibi değil. Pester ile çok sınırlı bir deneyime sahibim, fakat IMHO Pester çok sınırlı bir çerçevedir, hayır/öncesi, iç içe tarif edilmemiş, kırık eşleştirici uygulaması vs. – mbergal

+1

Katkıda bulunmayı düşünün :) – manojlds

cevap

8

çağrı operatörü (&) her zaman yeni bir kapsam kullanır. (.):

$ErrorActionPreference = "Stop" 

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

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

function after($sb) 
    { 
    . $sb 
    } 

describe 

Not . function kullanımı `$ aaaa tanımlandığı gibidir aynı kapsamda fonksiyonu çağırmak için yerine, nokta kaynağı operatörü kullanın.

İlgili konular