2013-12-14 12 views
20
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(); 
    }); 
}); 

Quanto sopra attualmente non funzionerebbe in moka.mocha passare variabile al test successivo

Una soluzione sarebbe avere una variabile condivisa tra i test, come mostrato sopra.

Con async.waterfall() questo è molto possibile e mi piace molto. C'è un modo per farlo accadere in moka?

Grazie!

risposta

40

È preferibile mantenere i test isolati in modo che un test non dipenda da un calcolo eseguito in un altro. Chiamiamo il test che dovrebbe passare un test valore A e il test che dovrebbe farlo testare B. Alcuni questione da considerare:

  1. sono test A e test di B in realtà due diversi test? In caso contrario, potrebbero essere combinati.

  2. Il test A è inteso a fornire il test B con un apparecchio da testare? In tal caso, il test A dovrebbe diventare il callback per una chiamata before o beforeEach. In pratica passi i dati in giro assegnandoli a variabili nella chiusura di describe.

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

ho letto il codice di Mocha, e purché non sto dimenticando qualcosa, non v'è alcun modo per chiamare describe, it, o il done callback per passare i valori intorno. Quindi il metodo di cui sopra è.

+0

Da esso ('fare qualcosa', la funzione (valore, fatto) {... il parametro "value" deve essere omesso , non dovrebbe? – onetom

+0

@onetom Sì! Grazie per la segnalazione del bug. – Louis

+1

che dire nidificate descrive? ottengo un token di accesso in un prima() metodo che quasi ogni successiva prova ha bisogno di usare. – metaColin

6

Molto d'accordo con quello che Louis ha detto, e questi sono i motivi per cui Mocha in realtà non lo supporta. Pensa al metodo asincrono a cui fai riferimento; se il tuo primo test fallisce, ottieni un guasto a cascata su tutti gli altri.

Il vostro unico modo per andare a questo proposito è, come dici tu, di attaccare una variabile in alto:

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

Salve, una piccola correzione per la tua dichiarazione (citando i documenti di async): "se una delle funzioni passa un errore al callback, la funzione successiva non viene eseguita e il callback principale viene immediatamente chiamato con l'error' ... Ma grazie però – Poni

+0

Sì, ma il problema con questo metodo è poi annullare qualsiasi esecuzione dei seguenti test del tutto, piuttosto che in mancanza della prima prova e continuare alla fase successiva - Ha senso? – whitfin

+0

Sembra bello, purtroppo non riesco a farlo funzionare. o.O – Antoine

2

E 'anche possibile aggiungere all'oggetto seme o contesto.

In questo esempio, viene aggiunto all'oggetto vestito

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

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


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

Si noti che il 'questo 'qui è diverso da' questo 'a se non si stavano usando le funzioni di freccia ... Penso. (Almeno, nel mio caso, quello che stavo cercando di fare non funzionava, fino a quando mi sono reso conto che stavo mescolando frecce e funzioni normali.) Mocha consiglia di non usare le funzioni freccia: https://mochajs.org/#arrow- funzioni –

Problemi correlati