web-dev-qa-db-fra.com

Comment réutiliser beforeEach / afterEach dans Jasmine JS?

Lors de l'écriture de tests avec JasmineJS, j'ai de nombreux tests qui ont un code beforeEach/afterEach similaire.

Existe-t-il un moyen d'implémenter un modèle d'héritage à l'aide de suites de tests JasmineJS?

Je peux regrouper tous les tests dans un seul describe mais dans ce cas, je terminerai avec un seul fichier HUGE JS contenant tous les tests.

Je voudrais diviser les tests pour chaque page.

Voici un exemple:

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

})
38
Adi Roiban

Je pense que cela est partiellement examiné dans cet article de blog et aussi répondu ici mais j'ajoute une réponse adaptée à votre exemple:

Code réutilisable:

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

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

Comment l'utiliser:

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

Si vous souhaitez le faire pour toutes vos suites, vous pouvez enregistrer une fonction beforeEach ou afterEach dans le topSuite:

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

Si vous ne souhaitez l'appliquer qu'à certaines suites, vous pouvez travailler avec des sous-suites:

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

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

}
18
Steven

Jasmine vous permet de mettre beforeEach et afterEach en dehors d'un appel describe. De cette façon, vous pouvez avoir une configuration et un démontage qui sont globaux pour toutes vos spécifications. Votre appel à logout() semble être un bon candidat pour le démontage global, et si toutes vos spécifications se connectent en tant qu'administrateur, vous pouvez également déplacer cela vers une portée globale.

Pour les choses qui sont utilisées dans certaines, mais pas toutes, les spécifications, avoir une méthode comme votre login_as_admin() semble être le meilleur moyen de consolider cette logique en un seul endroit.

3
Gregg

Référence: ( Blog Pivotal Labs: Davis W. Frank )

Il décrit la collecte de fonctionnalités partagées dans une fonction qui est appelée avec des paramètres pour les différentes suites individuelles. L'appel de cette fonction dans chaque suite exécutera la configuration/configuration commune.

Quant à la répartition des tests entre les fichiers; le fichier avec la fonction partagée peut être inclus dans chaque page avec une balise <script> si les tests sont basés sur un navigateur, ou par une require(...) vers le haut si les tests sont basés sur des nœuds. Vous pouvez ensuite exécuter les tests indépendamment, mais en utilisant cette configuration partagée qui n'est définie qu'une seule fois.

0
xst