2015-09-18 12 views
21

Recentemente ho riscontrato un problema che non riesco a spiegare. Ho un sacco di codice in questi test così ho intenzione di fare del mio meglio per catturare l'idea quiMoca prima della partita prima dell'esecuzione

ho le prove che sembrano:

describe('main page', function(){ 
    beforeEach(function(done){ 
    addUserToMongoDb(done); // #1 
    }); 

    afterEach(function(done){ 
    removeUserFromMongoDb(done); 
    }); 

    context('login', function(){ 
    it('should log the user in, function(){ 
     logUserIn(user_email); // #2 - This line requires the user from the beforeEach 
    }); 
    }); 

    context('preferences', function(){ 
    before(function(done){ //#3 
     logUserInBeforeTest(user_email); 
    }); 

    it('should show the preferences', function(){ 
     doCheckPreferences(); // #4 
    }); 
    }); 
}); 

Il problema è che il beforeeach da #1 funziona benissimo . Posso vederlo accadere sul DB e sui test nel passaggio #2.

Tuttavia, i test nel contesto delle preferenze su #4 non riescono perché non è possibile trovare l'utente per accedere a #3.

Sembra che il contesto before venga eseguito prima della descrizione beforeEach, che causa il loro errore. Se si sposta logUserIn nel blocco it, funziona correttamente.

Cosa potrebbe causare questo?

+1

Impossibile spiegare perché * "Sembra che il contesto prima sia eseguito prima della descrizione di Before" *, ma non dovresti eseguire 'done' ad un certo punto prima? –

+0

Prima è prima dell'intero blocco, prima di Each è prima di ogni test. –

+1

@StevenScott Ecco perché allora. La descrizione prima di Ognuno viene eseguita dopo il contesto precedente. Vorrei che la documentazione rendesse più ovvio lo – Tomo

risposta

35

Il test runner di Mocha spiega questa funzionalità come la migliore in Hooks section of the Mocha Test Runner.

Dalla sezione Ganci:

describe('hooks', function() { 

    before(function() { 
     // runs before all tests in this block 
    }); 

    after(function() { 
     // runs after all tests in this block 
    }); 

    beforeEach(function() { 
     // runs before each test in this block 
    }); 

    afterEach(function() { 
     // runs after each test in this block 
    }); 

    // test cases 
}); 

È possibile nidificare queste routine all'interno di altri descrivere blocchi che possono anche avere prima/beforeeach routine.

15

Ho trovato un problema simile. La documentazione è fuorviante perché "prima di questo blocco" significa (almeno per me) "prima di descrivere questa sezione". Nel frattempo significa "prima di qualsiasi sezione descriva". Controllare questo esempio:

describe('outer describe', function() { 
    beforeEach(function() { 
     console.log('outer describe - beforeEach'); 
    }); 

    describe('inner describe 1', function() { 
     before(function() { 
      console.log('inner describe 1 - before'); 
     }); 

    describe('inner describe 2', function() { 
     beforeEach(function() { 
      console.log('inner describe 2 - beforeEach'); 
     }); 
}); 

// output will be: 
// inner describe 1 - before 
// outer describe - beforeEach 
// inner describe 2 - beforeEach 

Sembra non importa dove nella gerarchia si inserisce il before - verrà eseguito prima di qualsiasi descrivono e non prima della sua contenenti descrivere.

+0

Pensa a "prima di ogni blocco". Questo significa prima di ogni test e prima di ogni descrizione. –

3

Il motivo della confusione si trova nella documentazione di moka. Si può trovare in mocha:

test possono comparire prima, dopo, o intervallati con i vostri ganci. I ganci verranno eseguiti nell'ordine in cui sono definiti, a seconda dei casi; tutti gli hook precedenti() eseguono (una volta), quindi tutti gli hook beforeEach(), i test, gli hook afterEach() e infine gli hook after() (una volta).

ganci discussi before e beforeEach vengono eseguite destra prima tutti o ogni it rispettivamente - ci sono alcun modo per eseguirlo prima descrivono sezione.

Qui è possibile la risposta find del contributore n. 1 al ramo master della mocha all'idea aggiungere qualcosa come beforeDescribe hook.

Penso che dovresti dare un'occhiata alla --delay moka option.

Problemi correlati