2016-07-25 11 views
1

Ich habe versucht, dies durch, Lesen SO Fragen zu denken, und ich habe einen kleinen Test erstellt:Gibt es in Jasmine irgendwelche Unterschiede zwischen beforeAll() und lassen?

describe("let",() => { 
    let x = 1; 
    it("",function() { 
    console.log(x + "<< it"); 
    console.log(y + "<< it"); 
    }); 
}); 

describe("beforeAll()",() => { 
    let x; 
    let y = 2; 
    beforeAll(() => { 
    x = 1; 
    }); 
    it("",function() { 
    console.log(x + "<< it"); 
    console.log(y + "<< it"); 
    }); 
}); 

Wo wird der Ausgang wie folgt:

LOG: '1<< it' 
LOG: 'undefined<< it' 
LOG: '1<< it' 
LOG: '2<< it' 

Das bedeutet für mich, dass sowohl beforeAll() und let werden beide auf die containing-Funktion beschränkt und ausgeführt, bevor eines der enthaltenen its ausgeführt wird. Mit let (und in der Tat var) mein Verständnis von JavaScript-Scoping lässt die Ergebnisse erwarten lassen.

Dies würde in RSpec nicht passieren, wo y im ersten Test wie beschrieben definiert werden würde außerhalb der it s ausgeführt werden. (Dies ist der Hauptgrund, nach dem ich frage, ich würde gerne unnötigen Code bereinigen, wenn möglich, da let sauberer ist, anstatt dass ein RSpec Hangover zu unnötiger Ausführlichkeit führt).

Gibt es irgendwelche Unterschiede zwischen beforeAll() und let, von denen ich nicht weiß (dass Fehler in meinem Test/Verständnis möglicherweise verschleiert haben)?

Antwort

1

beforeAll Callback hat Zugriff auf Spezifikation this und kann asynchron sein.

Wenn this Kontext nicht in Spezifikationen verwendet wird, würde ich vorschlagen, let/const für Konstanten und beforeAll für Setup-Aktionen verwendet werden (das kann optional mit afterAll gepaart werden).