2013-06-26 5 views
32

Beim Schreiben von Tests mit JasmineJS habe ich viele Tests, die vor jedem/nach jedem Code ähnlich sind.Wie wiederverwenden vorEach/nachJeden in Jasmine JS?

Gibt es eine Möglichkeit, ein Vererbungsmodell mit JasmineJS-Testsuiten zu implementieren?

Ich kann alle Tests in einem einzigen describe gruppieren, aber in diesem Fall werde ich mit einer einzigen HUGE JS-Datei enden, die alle Tests enthält.

Ich möchte die Tests für jede Seite teilen. Hier

ein Beispiel:

describe('Services Page', function() { 

    beforeEach(function() { 
     login_as_admin() 
    }) 

    beforeEach(function() { 
     browser().navigateTo('/services') 
    }) 

    if('Some test for services page', function() {}) 

    afterEach(function() { 
     logout() 
    }) 

}) 


describe('Administrators Page', function() { 

    beforeEach(function() { 
     login_as_admin() 
    }) 

    beforeEach(function() { 
     browser().navigateTo('/administrators') 
    }) 

    if('Some test for administrators page', function() {}) 

    afterEach(function() { 
     logout() 
    }) 

}) 
+1

wird jede Seite haben 'login_as_admin()' und 'logout()'? – xst

Antwort

27

Ich denke, das teilweise in this blog post untersucht und auch answered here aber ich hinzufüge, eine angepasste Antwort für Ihr Beispiel:

Wiederverwendbare Code:

function sharedSetup(startPage) { 
    beforeEach(function() { 
     login_as_admin(); 
     browser().navigateTo(startPage); 
    }); 

    afterEach(function() { 
     logout(); 
    }); 
}; 

Wie man es verwendet:

describe('Services Page', function() { 
    sharedSetup('/services'); 

    it('Some test for services page', function() {}); 
}); 

describe('Administrators Page', function() { 
    sharedSetup('/administrators'); 

    it('Some test for administrators page', function() {}); 
}); 
3

Jasmin ermöglicht es Ihnen, beforeEach und afterEach außerhalb eines describe Anruf zu setzen. Auf diese Weise können Sie für alle Ihre Spezifikationen global einrichten und entfernen. Ihr Aufruf scheint, als wäre es ein guter Kandidat für globale Teardown, und wenn alle Ihre Angaben als Administrator anmelden, könnten Sie dies auch in den globalen Bereich verschieben.

Für Dinge, die in einigen, aber nicht in allen Spezifikationen verwendet werden, scheint eine Methode wie Ihre login_as_admin() der beste Weg, um diese Logik an einem Ort zu konsolidieren.

0

Referenz: (Pivotal Labs Blog:Davis W. Frank)

Er beschreibt in einer Funktion gemeinsam genutzten Funktionalität zu sammeln, die mit den Parametern für die verschiedenen individuellen Suiten genannt wird. Durch Aufruf dieser Funktion in jeder Suite wird die allgemeine Konfiguration ausgeführt.

Wie zum Aufteilen von Tests über Dateien hinweg; Die Datei mit der gemeinsamen Funktion kann entweder auf jeder Seite mit einem <script>-Tag enthalten sein, wenn die Tests browserbasiert sind, oder mit einem require(...) in der Nähe des oberen Bereichs, wenn die Tests knotenbasiert sind. Sie können die Tests dann unabhängig ausführen, aber mit dem freigegebenen Setup, das nur einmal definiert ist.

12

Wenn Sie dies für alle Ihre Suiten tun möchten, können Sie eine beforeEach oder afterEach Funktion in der 01 registrieren:

jasmine.getEnv().topSuite().beforeEach({fn: function() { 
    //log in as admin 
}}); 

Wenn Sie es nur auf einigen Suiten anwenden, können Sie mit Unter Suiten arbeiten:

describe("as_admin", function() { 
    beforeEach(function() { 
    //log in as admin 
    }); 

    describe('Services Page',function() {...}); 
    describe('Administrators Page',function() {...}); 

} 
+0

Ich denke es ist auch möglich zu verwenden: jasmine.getEnv(). BeforeEach (function() { // login als admin }); basierend auf Tests in Änderungen enthalten: https://github.com/jasmine/jasmine/issues/811 – rajsite

+0

Sieht aus wie es wichtig ist, 'done()' Callback in 'beforeEach 'aufzurufen, wie es ohne es hängt. – Vanuan