2013-06-26 14 views
32

Podczas pisania testów z JasmineJS mam wiele testów, które mają podobny kod BeforeEach/afterEach.Jak użyć ponownie przed każdym/po każdym w Jasmine JS?

Czy istnieje sposób na wdrożenie modelu dziedziczenia przy użyciu zestawów testów JasmineJS?

Potrafię pogrupować wszystkie testy w pojedynczym describe, ale w tym przypadku zakończę jednym OGROMNYM plikiem JS zawierającym wszystkie testy.

Chciałbym podzielić testy dla każdej strony.

Oto przykład:

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

będzie każda strona ma 'login_as_admin()' i 'logout()'? – xst

Odpowiedz

27

myślę, że to jest częściowo zbadane in this blog post a także answered here ale Dodaję dostosowaną odpowiedź dla przykładu:

kod wielokrotnego użytku:

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

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

Jak go używać:

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

Jasmine nie pozwala umieścić beforeEach i afterEach poza z describe rozmowy. W ten sposób możesz mieć konfigurację i rozłączenie, które jest globalne dla wszystkich twoich specyfikacji. Twoje połączenie z numerem logout() wygląda na to, że może być dobrym kandydatem do globalnego odrzucenia, a jeśli wszystkie twoje dane techniczne zostaną zalogowane jako administrator, możesz przenieść je również do zasięgu globalnego.

Dla rzeczy używanych w niektórych, ale nie we wszystkich specyfikacjach, posiadanie metody takiej jak Twoja login_as_admin() wydaje się najlepszym sposobem na skonsolidowanie tej logiki w jednym miejscu.

0

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

Opisuje zbieranie wspólną funkcjonalność w funkcji, która jest wywoływana z parametrami dla różnych poszczególnych apartamentów. Wywołanie tej funkcji w każdym pakiecie spowoduje wykonanie wspólnej konfiguracji/konfiguracji.

Do dzielenia testów na pliki; plik z funkcją współdzieloną może być dołączony do każdej strony za pomocą znacznika <script>, jeśli testy są oparte na przeglądarce lub przez require(...) w pobliżu góry, jeśli testy są oparte na węzłach. Następnie można uruchomić testy niezależnie, ale przy użyciu tej konfiguracji współużytkowanej, która jest zdefiniowana tylko raz.

12

Jeśli chcesz zrobić to dla wszystkich swoich apartamentów, możesz zarejestrować funkcję beforeEach lub afterEach w topSuite:

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

Jeśli chcesz tylko, aby zastosować go w niektórych gałęziach, można pracować z podrzędnych apartamentów:

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

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

} 
+0

Myślę, że jest również możliwe użycie: jasmine.getEnv(). BeforeEach (function() { // zaloguj jako administrator }); na podstawie testów uwzględnionych w zmianach tutaj: https://github.com/jasmine/jasmine/issues/811 – rajsite

+0

Wygląda na to, że wywołanie komendy 'done()' jest ważne w 'beforeEach', ponieważ zawiesza się bez niego. – Vanuan

Powiązane problemy