Cum să reutilizați beforeEach/afterEach în Jasmine JS? (Programare, Javascript, Testare, Jasmine, Uscat)

Adi Roiban a intrebat.

Când scriu teste cu JasmineJS am multe teste care au cod beforeEach/afterEach similar.

Există o modalitate de a implementa un model de moștenire folosind suitele de teste JasmineJS?

Pot să grupez toate testele într-un singur describe dar în acest caz voi ajunge cu un singur fișier JS ENORM care conține toate testele.

Aș dori să împart testele pentru fiecare pagină.

Iată un exemplu:

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()
    })

})

Comentarii

  • va avea fiecare pagină login_as_admin() și logout()? –  > Por xst.
4 răspunsuri
Leo Gallucci

Cred că acest lucru este parțial examinat în această postare pe blog și, de asemenea, a răspuns aici, dar adaug un răspuns adaptat pentru exemplul dvs:

Cod reutilizabil:

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

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

Cum să îl utilizați:

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() {});
});

Comentarii

  • Linkul actualizat pentru postarea de pe blog este aici și aici o versiune veche cu fragmente de cod lipsă. –  > Por Augusto Franzoia.
Steven

Dacă doriți să faceți acest lucru pentru toate suitele dvs., puteți înregistra o aplicație beforeEach sau afterEach în fișierul topSuite:

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

Dacă doriți să o aplicați doar pe unele suite, puteți lucra cu sub-suite:

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

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

}

Comentarii

  • Cred că este de asemenea posibil să folosiți: jasmine.getEnv().beforeEach(function () { //log in as admin }); pe baza testelor incluse în modificările de aici: github.com/jasmine/jasmine/jasmine/issues/811 –  > Por rajsite.
  • Se pare că este important să apelați done() callback în beforeEach deoarece se blochează fără el. –  > Por Vanuan.
Gregg

Jasmine vă permite să puneți beforeEach și afterEach în afara unui describe apel. În acest fel, puteți avea o configurare și o desființare globală pentru toate specificațiile dumneavoastră. logout() pare a fi un candidat bun pentru o dezactivare globală, iar dacă toate specificațiile dvs. se conectează ca administrator, ați putea muta și acest lucru în domeniul global.

Pentru lucrurile care sunt utilizate în unele, dar nu în toate specificațiile, o metodă precum metoda dvs. login_as_admin() pare a fi cea mai bună modalitate de a consolida acea logică într-un singur loc.

xst

Referință: (Blogul Pivotal Labs: Davis W. Frank)

El descrie colectarea funcționalității partajate într-o funcție care este apelată cu parametri pentru diferitele suite individuale. Apelarea acestei funcții în cadrul fiecărei suite va executa configurarea/configurarea comună.

În ceea ce privește împărțirea testelor între fișiere; fișierul cu funcția partajată poate fi inclus fie în cadrul fiecărei pagini cu un fișier <script> dacă testele sunt bazate pe browser, fie prin intermediul unui tag require(...) în partea de sus a paginii, dacă testele se bazează pe noduri. Puteți apoi să executați testele independent, dar utilizând acea configurație partajată care este definită o singură dată.