web-dev-qa-db-fra.com

passer la variable mocha au prochain test

describe('some test', function(){
    // Could put here a shared variable
    it('should pass a value', function(done){
        done(null, 1);
    });
    it('and then double it', function(value, done){
        console.log(value * 2);
        done();
    });
});

Ce qui précède ne fonctionnerait pas actuellement en moka.

Une solution serait d'avoir une variable partagée entre les tests, comme indiqué ci-dessus.

Avec async.waterfall() c'est très possible et j'aime beaucoup. Existe-t-il un moyen d'y arriver avec du moka?

Merci!

24
Poni

Il est de loin préférable de garder les tests isolés de sorte qu'un test ne dépende pas d'un calcul effectué dans un autre. Appelons le test qui devrait réussir un test de valeur A et le test qui devrait le faire tester B. Quelques questions à considérer:

  1. Les tests A et B sont-ils vraiment deux tests différents? Sinon, ils pourraient être combinés.

  2. Le test A est-il destiné à fournir au test B un dispositif de test? Si c'est le cas, le test A devrait devenir le rappel d'un appel before ou beforeEach. Vous passez essentiellement les données en les affectant à des variables dans la fermeture de describe.

    describe('some test', function(){
        var fixture;
    
        before(function(done){
            fixture = ...;
            done();
        });
    
        it('do something', function(done){
            fixture.blah(...);
            done();
        });
    });
    

J'ai lu le code de Mocha et à condition de ne pas oublier quelque chose, il n'y a aucun moyen d'appeler describe, it ou le rappel done pour transmettre des valeurs. La méthode ci-dessus est donc celle-ci.

53
Louis

Je suis très d'accord avec ce que Louis a dit, et ce sont les raisons pour lesquelles Mocha ne le soutient pas réellement. Pensez à la méthode asynchrone à laquelle vous avez fait référence; si votre premier test échoue, vous obtenez un échec en cascade sur les autres.

Votre seule façon de procéder est, comme vous le dites, de coller une variable en haut:

describe('some test', function(){
    var value = 0;
    it('should pass a value', function(done){
        value = 5;
        done();
    });
    it('and then double it', function(done){
        console.log(value * 2); // 10
        done();
    });
});
7
whitfin

Il est également possible d'ajouter à la combinaison ou à l'objet contextuel.

Dans cet exemple, il est ajouté à l'objet costume

describe('suit', function(){
    before(() => {
        this.suitData = 'suit';
    });

    beforeEach(() => {
        this.testData = 'test';
    });


    it('test', done => {
         console.log(this.suitData)// => suit
         console.log(this.testData)// => test
    })
});
4
Yaki Klein