2014-09-29 8 views
11

Utilizzo di NodeJS e Mocha per il test. Penso di capire come funzionano prima() e beforeEach(). Il problema è che vorrei aggiungere uno script di installazione che viene eseguito prima di ogni "descrizione" piuttosto che prima di ogni "esso".Esecuzione della configurazione di Mocha prima di ogni suite anziché prima di ogni test

Se utilizzo before(), verrà eseguito una sola volta per l'intera suite e se utilizzo beforeEach() verrà eseguito prima di ogni singolo test, quindi sto cercando di trovare una via di mezzo.

Quindi, se questo è il mio file di prova:

require('./setupStuff'); 

describe('Suite one', function(){ 
    it('S1 Test one', function(done){ 
    ... 
    }); 
    it('S1 Test two', function(done){ 
    ... 
    }); 
}); 
describe('Suite two', function(){ 
    it('S2 Test one', function(done){ 
    ... 
    }); 
}); 

Mi piacerebbe avere "setupStuff" contiene una funzione che viene eseguito prima 'Suite uno' e 'Suite due'

Oppure, in altre parole, prima di 'S1 Test one' e 'S2 Test one' ma NON prima di 'S1 Test two'.

Si può fare?

risposta

15

Non c'è nessuna chiamata simile a beforeEach o before che fa quello che vuoi. Ma non è necessario, perché si può fare in questo modo:

function makeSuite(name, tests) { 
    describe(name, function() { 
     before(function() { 
      console.log("shared before"); 
     }); 
     tests(); 
     after(function() { 
      console.log("shared after"); 
     }); 
    }); 
} 

makeSuite('Suite one', function(){ 
    it('S1 Test one', function(done){ 
     done(); 
    }); 
    it('S1 Test two', function(done){ 
     done(); 
    }); 
}); 

makeSuite('Suite two', function(){ 
    it('S2 Test one', function(done){ 
    done(); 
    }); 
}); 
+0

Che funziona! Grazie – FuzzyYellowBall

4

si può anche fare in questo modo più flessibile:

require('./setupStuff'); 

describe('Suite one', function(){ 
    loadBeforeAndAfter(); //<-- added 
    it('S1 Test one', function(done){ 
    ... 
    }); 
    it('S1 Test two', function(done){ 
    ... 
    }); 
}); 
describe('Suite two', function(){ 
    loadBeforeAndAfter();//<-- added 
    it('S2 Test one', function(done){ 
    ... 
    }); 
}); 
describe('Suite three', function(){ 
    //use some other loader here, before/after, or nothing 
    it('S3 Test one', function(done){ 
    ... 
    }); 
}); 

function loadBeforeAndAfter() { 
    before(function() { 
    console.log("shared before"); 
    }); 
    after(function() { 
    console.log("shared after"); 
    }); 
} 
+1

Splendidamente modulare! – colsen

0

Ho trovato questo approccio ha funzionato per me, patches tutto descrivere le suite.

function suitePatches() 
{ 
    before(function() 
    { 
     // before suite behaviour 
    }); 
    after(function() 
    { 
     // after suite behaviour 
    }); 
} 

let origDescribe = describe; 
describe = function(n,tests) 
{ 
    origDescribe(n,function() 
    { 
     suitePatches(); 
     tests.bind(this)(); 
    }); 
} 
let origOnly = origDescribe.only; 
describe.only = function(n,tests) 
{ 
    origOnly(n,function() 
    { 
     suitePatches(); 
     tests.bind(this)(); 
    }); 
} 
describe.skip = origDescribe.skip; 

Differenze con le altre risposte sono:

  • L'uso di bind per chiamare il tests che assicura che se chiamano le funzioni di this, come this.timeout(1000) continua a funzionare.
  • La gestione di .skip e .only significa che è ancora possibile utilizzare quelli della suite, ad esempio describe.skip per sopprimere temporaneamente le suite.
  • Sostituire la funzione describe per nome consente un'iniezione meno invasiva.
    • Questo non può essere per tutti i gusti, in questo caso, ovviamente, un nome di funzione alternativa può essere utilizzata pur avvalendosi della corretta gestione di chiamare la tests e only e skip.
Problemi correlati